
    iW                        d Z ddlmZ ddlZddlZddlZddlmZ ddl	Z	 ee
      j                         j                  d   Zedz  Z e	j                  d      d	        Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)u  tests/regression/test_p0_6_fetch_race.py — task-2471 회귀 테스트.

토르가 commit 2be9a181 에서 ``scripts/lifecycle_guards.py`` 의 P0-6 SHA fetch
race 결함 수정한 동작을 영구 차단한다.

- ``_safe_git_fetch(base_ref, cwd) -> bool`` 시그니처
- ``_rev_parse_origin(base_ref, cwd) -> str | None`` 시그니처
- ``fetch_origin_head_sha(base_ref, *, cwd=None, force_fetch=True)`` 시그니처
  (``force_fetch`` 파라미터 존재 + 기본 True)
- ``check_merge_commit_sha`` 시그니처 보존 (기존 호출자 호환)
- subprocess 호출 mock 으로 정상 동작 검증

헤임달(개발2팀 테스터) 작성.
    )annotationsN)Path   scriptsmodule)scopec                    t         dz  } | j                         sJ t        t               t        j                  vr-t        j                  j                  dt        t                      t        t              t        j                  vr-t        j                  j                  dt        t                     t        j                  j                  dt        |             }||j                  J t        j                  j                  |      }|t        j                  |j                  <   |j                  j                  |       |S )u5   ``scripts/lifecycle_guards.py`` 절대 경로 로드.zlifecycle_guards.pyr   lifecycle_guards_p06_test_alias)SCRIPTS_DIRexistsstrsyspathinsert	WORKSPACE	importlibutilspec_from_file_locationloadermodule_from_specmodulesnameexec_module)	file_pathspecmods      </home/jay/workspace/tests/regression/test_p0_6_fetch_race.pylgr      s     33I ;sxx'3{+,
9~SXX%3y>*>>11)3y>D  777
..
)
)$
/C CKK		KKC J    c                    t        | d      sJ t        j                  | j                        }t	        |j
                        }d|v sJ d|v sJ y)z+``_safe_git_fetch(base_ref, cwd) -> bool``._safe_git_fetchbase_refcwdN)hasattrinspect	signaturer!   list
parametersr   sigparamss      r   test_safe_git_fetch_signaturer,   6   sQ    2()))


B..
/C#..!FF??r   c                    t        | d      sJ t        j                  | j                        }t	        |j
                        }d|v sJ d|v sJ y)z3``_rev_parse_origin(base_ref, cwd) -> str | None``._rev_parse_originr"   r#   N)r$   r%   r&   r.   r'   r(   r)   s      r   test_rev_parse_origin_signaturer/   ?   sQ    2*+++


B00
1C#..!FF??r   c                    t        | d      sJ t        j                  | j                        }|j                  }d|v sJ d|v sJ d|v sJ dt        |              |d   j                  du sJ y)uR   ``fetch_origin_head_sha`` 의 시그니처에 ``force_fetch`` 파라미터 존재.fetch_origin_head_shar"   r#   force_fetchu?   force_fetch 파라미터 없음 (P0-6 race fix 누락 의심): TN)r$   r%   r&   r1   r(   r'   defaultr)   s      r   0test_fetch_origin_head_sha_has_force_fetch_paramr4   H   s    2.///


B44
5C^^FF??F" 
I$v,X" - ((D000r   c                    t        | d      sJ t        j                  | j                        }|j                  }d|v sJ d|v sJ d|v sJ d|v sJ y)u   ``check_merge_commit_sha`` 시그니처 보존 (기존 호출자 호환).

    토르가 P0-6 race-fix 진행하면서 호출자 호환성을 깨면 안 됨.
    check_merge_commit_sha	pr_numberrepobase_branchr#   N)r$   r%   r&   r6   r(   r)   s      r   /test_check_merge_commit_sha_signature_preservedr:   W   sj    
 2/000


B55
6C^^F&   VF"""F??r   c                    ddifd}d }|j                  | d|       |j                  | d|       ddl}|j                  |d	d
        | j                  dd      }|dk(  sJ d   du sJ d       y)uM   ``force_fetch=False`` 시 ``_safe_git_fetch`` 가 호출되지 않아야 함.flagFc                    ~ ~dd<   y)NTr<    )_base_cwdfetch_calleds     r   _fake_fetchzOtest_fetch_origin_head_sha_force_fetch_false_no_fetch_call.<locals>._fake_fetcho   s    4#Vr   c                     ~ ~y)Nstable_sha_aaaaaar>   r?   r@   s     r   _fake_rev_parsezStest_fetch_origin_head_sha_force_fetch_false_no_fetch_call.<locals>._fake_rev_parset   s
    4"r   r!   r.   r   Nsleepc                     y Nr>   _s    r   <lambda>zLtest_fetch_origin_head_sha_force_fetch_false_no_fetch_call.<locals>.<lambda>|       r   mainr2   rD   u+   force_fetch=False 였는데 fetch 호출됨setattrtimer1   )r   monkeypatchrB   rF   _tsharA   s         @r   :test_fetch_origin_head_sha_force_fetch_false_no_fetch_callrV   k   s    E?L
# -{;/AG^4

"
"6u
"
=C%%%%5(W*WW(r   c                    ddifd}d }|j                  | d|       |j                  | d|       ddl}|j                  |dd	        | j                  d
d      }|dk(  sJ d   dk\  sJ y)u=   ``force_fetch=True`` (기본) 시 ``_safe_git_fetch`` 호출.nr   c                $    ~ ~dxx   dz  cc<   y)NrX      Tr>   )r?   r@   fetch_counts     r   rB   zLtest_fetch_origin_head_sha_force_fetch_true_calls_fetch.<locals>._fake_fetch   s    4CAr   c                     ~ ~y)Nconsistent_shar>   rE   s     r   rF   zPtest_fetch_origin_head_sha_force_fetch_true_calls_fetch.<locals>._fake_rev_parse   s
    4r   r!   r.   NrG   c                     y rI   r>   rJ   s    r   rL   zItest_fetch_origin_head_sha_force_fetch_true_calls_fetch.<locals>.<lambda>   rM   r   rN   TrO   r]   rZ   rP   )r   rS   rB   rF   rT   rU   r[   s         @r   7test_fetch_origin_head_sha_force_fetch_true_calls_fetchr_      s    (K
  -{;/AG^4

"
"6t
"
<C""""sq   r   c                    t        g d      fd}d }|j                  | d|       |j                  | d|       ddl}|j                  |dd	        | j                  d
d      }|J y)uB   SHA 가 2회 fetch 모두에서 흔들리면 None (race detected).)sha_asha_bsha_csha_dc                     ~ ~t        d      S )Nsha_znextr?   r@   seqs     r   rF   zItest_fetch_origin_head_sha_unstable_returns_none.<locals>._fake_rev_parse   s    4C!!r   c                     ~ ~yNTr>   _b_cs     r   	_fetch_okzCtest_fetch_origin_head_sha_unstable_returns_none.<locals>._fetch_ok   
    r   r!   r.   r   NrG   c                     y rI   r>   rJ   s    r   rL   zBtest_fetch_origin_head_sha_unstable_returns_none.<locals>.<lambda>   rM   r   rN   TrO   iterrQ   rR   r1   r   rS   rF   rp   rT   rU   rj   s         @r   0test_fetch_origin_head_sha_unstable_returns_nonerv      sx    
  C" -y9/AG^4

"
"6t
"
<C;;r   c                    t        g d      fd}d }|j                  | d|       |j                  | d|       ddl}|j                  |dd	        | j                  d
d      }|dk(  sJ y)uQ   1차/2차 불일치 후 재 fetch + 재 조회에서 일치하면 그 값 반환.)xyzrz   c                     ~ ~t        d       S rI   rg   ri   s     r   rF   zJtest_fetch_origin_head_sha_consistent_after_retry.<locals>._fake_rev_parse   s    4Cr   c                     ~ ~yrl   r>   rm   s     r   rp   zDtest_fetch_origin_head_sha_consistent_after_retry.<locals>._fetch_ok   rq   r   r!   r.   r   NrG   c                     y rI   r>   rJ   s    r   rL   zCtest_fetch_origin_head_sha_consistent_after_retry.<locals>.<lambda>   rM   r   rN   TrO   rz   rs   ru   s         @r   1test_fetch_origin_head_sha_consistent_after_retryr~      sz    
  C
 -y9/AG^4

"
"6t
"
<C#::r   c                    d }d }|j                  | d|       |j                  | d|       ddl}|j                  |dd        | j                  d	d
      }|J y)u;   ``_rev_parse_origin`` 가 None 반환하면 결과도 None.c                     ~ ~yrl   r>   rm   s     r   rp   z?test_fetch_origin_head_sha_rev_parse_failure.<locals>._fetch_ok   rq   r   c                     ~ ~y rI   r>   rm   s     r   	_rev_nonez?test_fetch_origin_head_sha_rev_parse_failure.<locals>._rev_none   rq   r   r!   r.   r   NrG   c                     y rI   r>   rJ   s    r   rL   z>test_fetch_origin_head_sha_rev_parse_failure.<locals>.<lambda>   rM   r   rN   FrO   rP   )r   rS   rp   r   rT   rU   s         r   ,test_fetch_origin_head_sha_rev_parse_failurer      sh     -y9/;G^4

"
"6u
"
=C;;r   c                    | j                  dd      }|j                  du sJ d|j                  v s.d|j                  j                         v sd|j                  v sJ yyy)u=   ``pr_number=None`` / ``repo=None`` 이면 즉시 fail-closed.N)r8   Fu   필요requiredzP0-6)r6   okreasonlower)r   results     r   .test_check_merge_commit_sha_missing_args_failsr      sf    &&t$&7F99v}}$
fmm6I6I6K(KvY_YfYfOfffOf(K$r   )__doc__
__future__r   importlib.utilr   r%   r   pathlibr   pytest__file__resolveparentsr   r   fixturer   r,   r/   r4   r:   rV   r_   rv   r~   r   r   r>   r   r   <module>r      s    #   
  N""$,,Q/	)# h  21(X0!.400gr   