
    dj                       d Z ddlmZ ddlZddlmc mZ ddl	Z
ddlZddlmZ  ee      j                         j                   d   Z ee      ej&                  vr"ej&                  j)                  d ee             ddZ edd        ed	d
       ddlmZmZmZmZmZmZmZ dZdZdZ dZ!d Z"d Z#d Z$d Z%d Z&d Z'd Z(d Z)d Z*d Z+d Z,y)u  task-2686 regression — session propagation classifier 4 enum 검증.

회장 verbatim 6번: mismatch 시 ``AUTHORITATIVE_BUT_SESSION_DISCONTINUITY``
분류 강제. 본 테스트는 ``classify_session_propagation`` 의 4 enum 분기
모두를 커버한다:

  1. ``AUTHORITATIVE_CALLBACK_COLLECTOR_PROCESSED`` — ANU + 3 SID 일치.
  2. ``AUTHORITATIVE_BUT_SESSION_DISCONTINUITY`` — ANU + collector/delivery SID
     가 chair_facing 과 불일치.
  3. ``NON_AUTHORITATIVE_SELF_COLLECTOR`` — observed owner == executor (self).
  4. ``SESSION_PROPAGATION_GAP`` — ANU owner 이나 chair_facing_session_id
     누락/invalid.

또한 ``SESSION_PROPAGATION_ENUM`` 이 정확히 4개 enum 값을 포함하는지 확인.
    )annotationsN)Path   c                   t         j                  j                  |       }|t        |dd      j	                  |      r|S t
        j                  j                  | t        |z        }g }d }||u}|}|r|j                  }d }	||	u}
|
}|slt        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }|j!                  |       |rt        j                  d
fd		f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |	      d
z  }dd|iz  }|j!                  |       t        j"                  |d      i z  }dd|iz  }t%        t        j&                  |            d x}x}x}x}x}x}
}	t
        j                  j)                  |      }|t         j                  | <   |j                  j+                  |       |S )N__file__ )is not)z%(py2)s is not %(py5)sspec)py2py5z%(py7)spy7)z5%(py11)s
{%(py11)s = %(py9)s.loader
} is not %(py14)s)py9py11py14z%(py16)spy16r   zassert %(py19)spy19)sysmodulesgetgetattrendswith	importlibutilspec_from_file_location_ROOTloader
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprappend_format_boolopAssertionError_format_explanationmodule_from_specexec_module)modnamerelpathexistingr
   @py_assert1@py_assert4@py_assert3@py_assert0@py_assert10@py_assert13@py_assert12@py_format6@py_format8@py_format15@py_format17@py_format18@py_format20mods                     s/home/jay/workspace/.worktrees/task-2696-dev7/tests/regression/callback_session_propagation/test_classifier_enum.py
_load_realr;      sa   {{w'H*b A J J7 S>>11'57?KD7t74t77474 777774t77777747774777t77777774777777777777777477777777777777
..
)
)$
/CCKKKKC J    z dispatch.callback_owner_enforcerz#dispatch/callback_owner_enforcer.pyz(dispatch.normal_fallback_callback_helperz+dispatch/normal_fallback_callback_helper.py)!SESSION_PROPAGATION_DISCONTINUITYSESSION_PROPAGATION_ENUMSESSION_PROPAGATION_GAPSESSION_PROPAGATION_OKSESSION_PROPAGATION_SELF_KEYSessionPropagationVerdictclassify_session_propagationc119085addb0f8b79c4f7c5e9c4f7c5ez$53e89540-5bed-4692-a726-ed857820758az$12345678-1234-1234-1234-123456789abcc                    t         t        t        t        h} t	        |       }t
        |k(  }|st        j                  d|fdt
        |f      dt        j                         v st        j                  t
              rt        j                  t
              nddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |       t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x} }t        t
              }d}||k(  }|st        j                  d|fd	||f      d
t        j                         v st        j                  t              rt        j                  t              nd
dt        j                         v st        j                  t
              rt        j                  t
              ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y )N==)z0%(py0)s == %(py6)s
{%(py6)s = %(py2)s(%(py4)s)
}r>   	frozenset)py0r   py4py6zassert %(py8)spy8   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slen)rJ   py1py3rL   )r@   r=   rA   r?   rI   r>   r   r   r   r    r!   r"   r%   r&   rO   )r.   @py_assert5r,   @py_format7@py_format9@py_assert2r-   s          r:   5test_session_propagation_enum_has_exactly_four_valuesrV   <   s   )$	2 y 2 ( # (   
 # (  
  
  $  
  $  
  
  (1  
  (1  
 2  
 (    
   '(-A-(A----(A------3---3------'---'---(---A-------r<   c                    t        t        t        t        t        t              } t	        | t
              }|sddt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |       rt        j                  |       nddt        j                         v st        j                  t
              rt        j                  t
              ndt        j                  |      dz  }t        t        j                  |            d }| j                  }|t        k(  }|st        j                  d|fd|t        f      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      d	t        j                         v st        j                  t              rt        j                  t              nd	d
z  }dd|iz  }t        t        j                  |            d x}}| j                   }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y )Nchair_facing_session_idcollector_session_iddelivery_session_idobserved_owner_keyexecutor_keyz5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}
isinstancevrB   )rJ   rP   r   rK   rG   z6%(py2)s
{%(py2)s = %(py0)s.classification
} == %(py4)sr@   rJ   r   rK   assert %(py6)srL   Tisz=%(py2)s
{%(py2)s = %(py0)s.observed_owner_is_anu
} is %(py5)srJ   r   r   assert %(py7)sr   )rC   	CHAIR_SIDANU_KEYEXECUTOR_KEYr^   rB   r   r    r   r!   r"   r%   r&   classificationr@   r   observed_owner_is_anu)r_   r.   @py_format5r,   rS   r-   r3   r4   s           r:   8test_classify_authoritative_processed_when_all_sid_matchrn   F   s   $ )&%"!	A a233333333:333:333333a333a333333233323333333333555555555555515551555555555555555555555""*d*"d****"d******1***1***"***d*******r<   c                 >   t        t        ddt        t              } | j                  }|t
        k(  }|st        j                  d|fd|t
        f      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      dt        j                         v st        j                  t
              rt        j                  t
              nddz  }dd	|iz  }t        t        j                  |            dx}}y)
uX   Tier 1 doctrine 호환: collector/delivery 미명시여도 chair_facing 만 일치 PASS.NrX   rG   r`   r_   r@   ra   rb   rL   )rC   rh   ri   rj   rk   r@   r   r   r   r    r!   r"   r%   r&   r_   r,   r.   rm   rS   s        r:   >test_classify_authoritative_processed_when_partial_sid_presentrq   S   s    $ )! "!	A 555555555555515551555555555555555555555r<   c                 N   t        t        t        t        t        t              } | j
                  }|t        k(  }|st        j                  d|fd|t        f      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              nddz  }dd|iz  }t        t        j                  |            d x}}| j                  }d	}||u }|st        j                  d
|fd||f      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}d | j                   D        }t#        |      }|sddt        j                         v st        j                  t"              rt        j                  t"              ndt        j                  |      t        j                  |      dz  }t        t        j                  |            d x}}y )NrX   rG   r`   r_   r=   ra   rb   rL   Trc   re   rf   rg   r   c              3  @   K   | ]  }d |j                         v   yw)mismatchN)lower).0rs     r:   	<genexpr>zJtest_classify_discontinuity_when_collector_sid_diverges.<locals>.<genexpr>i   s     :1zQWWY&:s   z,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}any)rC   rh   	OTHER_SIDri   rj   rk   r=   r   r   r   r    r!   r"   r%   r&   rl   reasonsry   r_   r,   r.   rm   rS   r-   r3   r4   s           r:   7test_classify_discontinuity_when_collector_sid_divergesr}   _   sw   $ )&%"!	A @@@@@@@@@@@@@1@@@1@@@@@@@@@@@@@@@@@@@@@""*d*"d****"d******1***1***"***d*******:		::3:::::::::3:::3::::::::::::::r<   c                 N   t        t        t        t        t        t              } | j
                  }|t        k(  }|st        j                  d|fd|t        f      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              nddz  }dd|iz  }t        t        j                  |            d x}}y )	NrX   rG   r`   r_   r=   ra   rb   rL   )rC   rh   rz   ri   rj   rk   r=   r   r   r   r    r!   r"   r%   r&   rp   s        r:   6test_classify_discontinuity_when_delivery_sid_divergesr   l   s    $ )&%"!	A @@@@@@@@@@@@@1@@@1@@@@@@@@@@@@@@@@@@@@@r<   c                    t        t        t        t        t        t              } | j                  }|t        k(  }|st        j                  d|fd|t        f      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              nddz  }dd|iz  }t        t        j                  |            d x}}| j                  }d	}||u }|st        j                  d
|fd||f      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y )NrX   rG   r`   r_   rA   ra   rb   rL   Frc   re   rf   rg   r   )rC   rh   rj   rk   rA   r   r   r   r    r!   r"   r%   r&   rl   r|   s           r:   3test_classify_self_collector_when_owner_is_executorr   w   s   $ )&%'!	A ;;;;;;;;;;;;;1;;;1;;;;;;;;;;;;;;;;;;;;;""+e+"e++++"e++++++1+++1+++"+++e+++++++r<   c                 F   t        t        t        t        dt              } | j                  }|t        k(  }|st        j                  d|fd|t        f      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              nddz  }dd	|iz  }t        t        j                  |            d
x}}y
)uV   ANU 아닌 임의 key 도 동일하게 SELF_COLLECTOR 로 분류 (task-2680 doctrine).ffffffffffffffffrX   rG   r`   r_   rA   ra   rb   rL   N)rC   rh   rj   rk   rA   r   r   r   r    r!   r"   r%   r&   rp   s        r:   /test_classify_self_collector_when_owner_not_anur      s    $ )&%-!	A ;;;;;;;;;;;;;1;;;1;;;;;;;;;;;;;;;;;;;;;r<   c                    t        d d d t        t              } | j                  }|t        k(  }|st        j                  d|fd|t        f      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              nddz  }dd|iz  }t        t        j                  |            d x}}| j                  }d	}||u }|st        j                  d
|fd||f      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y )NrX   rG   r`   r_   r?   ra   rb   rL   Trc   re   rf   rg   r   )rC   ri   rj   rk   r?   r   r   r   r    r!   r"   r%   r&   rl   r|   s           r:   4test_classify_propagation_gap_when_chair_sid_missingr      s   $ $! "!	A 666666666666616661666666666666666666666""*d*"d****"d******1***1***"***d*******r<   c                 F   t        dt        t        t        t              } | j                  }|t
        k(  }|st        j                  d|fd|t
        f      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      dt        j                         v st        j                  t
              rt        j                  t
              nddz  }dd	|iz  }t        t        j                  |            d x}}y )
Nz
not-a-uuidrX   rG   r`   r_   r?   ra   rb   rL   )rC   rh   ri   rj   rk   r?   r   r   r   r    r!   r"   r%   r&   rp   s        r:   4test_classify_propagation_gap_when_chair_sid_invalidr      s    $ ,&%"!	A 666666666666616661666666666666666666666r<   c                 6   t        dddt        t              } | j                  }|t        k(  }|st	        j
                  d|fd|t        f      dt        j                         v st	        j                  |       rt	        j                  |       ndt	        j                  |      dt        j                         v st	        j                  t              rt	        j                  t              nddz  }dd	|iz  }t        t	        j                  |            dx}}y)
uT   우선순위 1 (self-key) > 3 (gap): SID 누락이어도 self-key 가 먼저 분류.NrX   rG   r`   r_   rA   ra   rb   rL   )rC   rj   rk   rA   r   r   r   r    r!   r"   r%   r&   rp   s        r:   6test_classify_self_key_takes_priority_over_session_gapr      s    $ $! '!	A ;;;;;;;;;;;;;1;;;1;;;;;;;;;;;;;;;;;;;;;r<   c                 $	   t        t        t        t        t        t              } | j                         }|d   }|t        k(  }|st        j                  d|fd|t        f      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              nddz  }dd|iz  }t        t        j                  |            d x}}|d	   }|t        k(  }|st        j                  d|fd|t        f      t        j                  |      d
t        j                         v st        j                  t              rt        j                  t              nd
dz  }dd|iz  }t        t        j                  |            d x}}|d   }|t        k(  }|st        j                  d|fd|t        f      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              nddz  }dd|iz  }t        t        j                  |            d x}}|d   }|t        k(  }|st        j                  d|fd|t        f      t        j                  |      d
t        j                         v st        j                  t              rt        j                  t              nd
dz  }dd|iz  }t        t        j                  |            d x}}|d   }d}||u }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|d   }	t        |	t               }
|
sddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |	      dt        j                         v st        j                  t               rt        j                  t               ndt        j                  |
      dz  }t        t        j                  |            d x}	}
y )NrX   rk   rG   )z%(py1)s == %(py3)sr=   )rP   rQ   zassert %(py5)sr   rY   rh   rZ   rz   r[   rl   Trc   )z%(py1)s is %(py4)s)rP   rK   rb   rL   r{   z5assert %(py5)s
{%(py5)s = %(py0)s(%(py2)s, %(py3)s)
}r^   list)rJ   r   rQ   r   )rC   rh   rz   ri   rj   to_jsonr=   r   r   r"   r   r    r!   r%   r&   r^   r   )r_   payloadr/   rU   @py_format4r3   r.   rm   rS   r,   r-   s              r:   test_verdict_to_json_roundtripr      s   $ )&%"!	A iikG#$I$(IIIII$(IIII$IIIIII(IIII(IIIIIIII,-:-::::-:::-::::::::::::::::)*7*i7777*i777*777777i777i7777777()6)Y6666)Y666)666666Y666Y6666666*+3t3+t3333+t333+333t3333333i(/:($////////:///:///(//////$///$//////////r<   )r)   strr*   r   )-__doc__
__future__r   builtinsr   _pytest.assertion.rewrite	assertionrewriter   importlib.utilr   r   pathlibr   r   resolveparentsr   r   pathinsertr;   (dispatch.normal_fallback_callback_helperr=   r>   r?   r@   rA   rB   rC   ri   rj   rh   rz   rV   rn   rq   r}   r   r   r   r   r   r   r    r<   r:   <module>r      s    #     
 X ((+u:SXXHHOOAs5z"	 -/T U 
57d e   !2	2	.
+	6
;A	,	<	+7	<0r<   