
     jD                       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m	Z	 ddl
Z
 ee      j                         j                  d   Z ee      ej                   v r!ej                   j#                   ee             ej                   j%                  d ee             ddlmZmZmZ ddlmZmZmZmZmZmZ  G d	 d
      Zddddddd	 	 	 	 	 d!dZd"d#dZ d Z!d Z"d Z#d Z$d Z%d Z&d Z'd Z(d Z)d Z*ddl+Z+ ee+jX                  j[                  d eej\                  j\                                    dz  dz  Z/e
j`                  jc                  dg d      d        Z2d  Z3y)$u6  tests/regression/test_post_merge_smoke_runner_2512.py — task-2512 회귀 12건.

회장 §1~12 매핑:
  1. PASS smoke
  2. FAIL smoke + Critical #7 packet
  3. TIMEOUT smoke + Critical #7 packet
  4. missing smoke + dry_run=True → SKIPPED
  5. missing smoke + dry_run=False → BLOCKED + escalation
  6. stdout head/tail capture
  7. stderr size cap
  8. JSON serialization round-trip
  9. Critical #7 enum 정확 매칭
 10. merge_commit propagation
 11. ★ replay fixtures (task-2506/2507/2509/2511)
 12. merge_queue continuation 신호 (allow_continuation)
    )annotationsN)Path)Optional   )CriticalEscalationTypeEscalationPacketSmokeResult)DEFAULT_OUTPUT_CAP_BYTESREPLAY_FIXTURESSMOKE_COMMAND_REGISTRYSmokeStatusbuild_smoke_failed_packetrun_post_merge_smokec                      e Zd ZdddZy)_FakeCompletedc                .    || _         || _        || _        y N
returncodestdoutstderr)selfr   r   r   s       I/home/jay/workspace/tests/regression/test_post_merge_smoke_runner_2512.py__init__z_FakeCompleted.__init__4   s    $    N) r   )r   intr   strr   r   )__name__
__module____qualname__r    r   r   r   r   3   s    r   r   r   F)r   r   r   raise_timeout
fetch_headfetch_returncodec                (     d fd	}|S )uM   Args 첫 토큰 기준으로 git fetch / git rev-parse / smoke 분기 처리.c                    ~| st        d      S | d d ddgk(  rt        dd      S | d d ddgk(  rt        xs dd      S r,t        j                  d	j                  |       |xs d
      t              S )Nr   r   gitfetchr   )r   r   z	rev-parse(0000000000000000000000000000000000000000 )cmdtimeoutoutputr   )r   
subprocessTimeoutExpiredjoin)	argscwdr-   r$   r%   r#   r   r   r   s	      r   _runzmake_fake_runner.<locals>._run>   s    !!$$8w''!"22bII8{++!"2J<R(\^__++ST4:6K KjGGr   )NNr"   )r   r   r   r#   r$   r%   r4   s   `````` r   make_fake_runnerr5   :   s    H H Kr   task_idc                    d}|,dj                  d |j                         D              }d| d}d| d| d}| | dz  }|j                  |d	
       |S )uR   task md 파일 생성. smoke_command 주어지면 yaml block에 list로 직렬화.r   
c              3  (   K   | ]
  }d | d  yw)z  - ""Nr"   ).0toks     r   	<genexpr>z!_write_task_md.<locals>.<genexpr>V   s     JSE#a.Js   z
smoke_command:
z# u    — fixture for tests

```yaml
expected_files:
  - "utils/post_merge_smoke_runner.py"

risk_area: "post_merge_smoke / fixture"
parallel_policy: "limited_parallel"
merge_queue_position: 9
stale_recheck_required: true
cherry_pick_allowed: falsez
```
.mdutf-8)encoding)r1   split
write_text)tmp_pathr6   smoke_command
yaml_smokeitemsmdps          r   _write_task_mdrI   R   s~    J 		JM4G4G4IJJ)%3
y 
 &, '
B 	gYc?"ALLgL&Hr   c                   t        | dd      }t        dddd      }t        |dd	|d
d      }|j                  t        j
                  k(  sJ |j                  j                  du sJ |j                  j                  dk(  sJ |j                  j                  J |j                  du sJ |j                  J |j                  ddgk(  sJ y )Nz	task-9001	pytest -qrD   r   ok
r   (abc12345abc12345abc12345abc12345abc12345)r   r   r   r$   F*   T	task_filemerge_commitdry_runrunner	pr_numberskip_stale_checkpytest-q)rI   r5   r   statusr   PASSsmoke_resultpassed	exit_codefailure_reasonallow_continuation
escalationrD   rC   task_mdrT   runs       r   test_01_pass_smokerd   n   s    X{+NG6")79F
dC ::)))))""d***%%*****222!!T)))>>!!!4 0000r   c                   t        | dd      }t        ddd      }t        |dd	|d
d      }|j                  t        j
                  k(  sJ |j                  j                  d	u sJ |j                  j                  dk(  sJ |j                  j                  dk(  sJ |j                  d	u sJ |j                  J |j                  j                  t        j                  k(  sJ y )Nz	task-9002rK   rL      zfailed test
z
error log
r   (bad0000000000000000000000000000000000000Fc   TrP   EXIT_1)rI   r5   r   rY   r   FAILr[   r\   r]   r^   r_   r`   escalation_typer   POST_MERGE_SMOKE_FAILEDra   s       r   ,test_02_fail_smoke_creates_critical_7_packetrm      s    X{+NG?=YF
(8%dC ::)))))""e+++%%*****h666!!U***>>%%%>>))-C-[-[[[[r   c                `   t        | dd      }t        ddd      }t        |dd	|d
d      }|j                  t        j
                  k(  sJ |j                  j                  dk(  sJ |j                  J |j                  j                  t        j                  k(  sJ |j                  d	u sJ y )Nz	task-9003rK   rL   Tzpartial
r   )r#   r   r   (t100000000000000000000000000000000000000Fd   rP   TIMEOUT)rI   r5   r   rY   r   rq   r[   r^   r`   rk   r   rl   r_   ra   s       r   /test_03_timeout_smoke_creates_critical_7_packetrr      s    X{+NGDRPF
tC ::,,,,,**i777>>%%%>>))-C-[-[[[[!!U***r   c                    t        | dd       }t        d      }t        |dd|d      }|j                  t        j
                  k(  sJ |j                  du sJ |j                  J |j                  J y )Nz	task-9004rL   r   r   (dry0000000000000000000000000000000000000TrQ   rR   rS   rT   rV   )	rI   r5   r   rY   r   SKIPPEDr_   r`   rD   ra   s       r   *test_04_missing_smoke_dry_run_true_skippedrx      s    X{$GG+F
(8$C ::,,,,,!!T)))>>!!!$$$r   c                @   t        | dd       }t        d      }t        |dd|d      }|j                  t        j
                  k(  sJ |j                  du sJ |j                  J |j                  j                  t        j                  k(  sJ |j                  J y )	Nz	task-9005rL   r   rt   (blk0000000000000000000000000000000000000FTrv   )rI   r5   r   rY   r   BLOCKEDr_   r`   rk   r   rl   rD   ra   s       r   +test_05_missing_smoke_dry_run_false_blockedr|      s    X{$GG+F
(8%C ::,,,,,!!U***>>%%%>>))-C-[-[[[[$$$r   c                L   t        | dd      }ddz  ddz  z   }t        d|d	      }t        |d
d|d      }|j                  t        j
                  k(  sJ |j                  j                  }d|v sJ d|v sJ d|v sJ t        |j                  d            t        dz   k  sJ y )Nz	task-9006rK   rL   z
HEAD_LINE
i  z
TAIL_LINE
r   r   r   (cap0000000000000000000000000000000000000FTrv   	HEAD_LINE	TAIL_LINE	TRUNCATEDr?      )rI   r5   r   rY   r   rZ   r[   stdout_taillenencoder
   )rC   rb   bigrT   rc   outs         r    test_06_stdout_head_tail_capturer      s    X{+NG4MD$8
9C3rBF
(8%C ::)))))



&
&C###szz'"#'?#'EEEEr   c                    t        | dd      }ddz  }t        dd|      }t        |d	d
|d      }|j                  j                  }d|v sJ d|v sJ t        |j                  d            t        dz   k  sJ y )Nz	task-9007rK   rL   zERROR_LINE
i'  rf   r   r   (err0000000000000000000000000000000000000FTrv   
ERROR_LINEr   r?   r   )rI   r5   r   r[   stderr_tailr   r   r
   )rC   rb   hugerT   rc   errs         r   test_07_stderr_size_capr      s    X{+NGE!D2dCF
(8%C 


&
&C3#szz'"#'?#'EEEEr   c                   t        | dd      }t        dd      }t        |dd|d	d
      }|j                         }t	        j
                  |      }dD ]  }||v rJ d|         |d   dk(  sJ |d   d   d
u sJ |d   d   dk(  sJ y )Nz	task-9008rK   rL   r   rM   r   r   (js00000000000000000000000000000000000000F   TrP   )
rR   r6   rY   r[   duration_msrD   r_   r`   stalerS   zmissing key: rY   rZ   r[   r\   command)rI   r5   r   to_jsonjsonloads)rC   rb   rT   rc   jsparsedkeys          r   %test_08_json_serialization_round_tripr      s    X{+NG6:F
dC 
BZZ^F2 4 f}3cU33}4 (v%%%.!(+t333.!),;;;r   c            	     n   t        dddddd      } t        ddd	| t        j                  d
dgd      }t	        |t
              sJ |j                  t        j                  k(  sJ |j                  j                  dk(  sJ d|j                  j                  v sJ |j                  sJ |j                  sJ y )NrK   Frf   xyri   )r   r\   r]   r   r   r^   z	task-9009(ee00000000000000000000000000000000000000rW   rX   rp   )r6   rU   rR   r[   rY   rD   r   rl   POST_MERGE_SMOKE)r	   r   r   rj   
isinstancer   rk   r   rl   valuesafe_optionsrecommended_option)srpackets     r   #test_09_critical_7_enum_exact_matchr     s    	EQS
B
 'q$2$/?	F f.///!!%;%S%SSSS!!''+DDDD!7!7!=!====$$$$r   c                   d}t        | dd      }t        ddd      }t        ||d	|d
d      }|j                  |k(  sJ |j                  J |j                  j
                  d   |k(  sJ |j                  j
                  d   dk(  sJ y )N(deadbeefdeadbeefdeadbeefdeadbeefdeadbeefz	task-9010rK   rL   r   r   boomr   FF   TrP   rR   r6   )rI   r5   r   rR   r`   evidence)rC   sharb   rT   rc   s        r    test_10_merge_commit_propagationr   !  s    
CX{+NG2fEF
UdC s""">>%%%>>"">2c999>>""9-<<<r   WORKSPACE_ROOTmemorytasks)z	task-2506z	task-2507z	task-2509z	task-2511c                   t         |   }|s
J d|        t        |   }|s
J d|        |d   ddt        |d         z
  z  z   }t        | dz  }|j	                         r|nt        | |d      }t        d	| d
      }t        ||d|d      }|j                  t        j                  k(  sJ |j                  |k(  s
J d|        |j                  |k(  sJ |j                  du sJ |j                  |k(  sJ |j                  J t        dd      }	t        ||d|	d      }
|
j                  t        j                   k(  sJ |
j                  |k(  sJ |
j                  J |
j                  j"                  t$        j&                  k(  sJ |
j                  j(                  d   |k(  sJ |
j                  j(                  d   |k(  sJ y)u-  4 replay fixture 모두 동일 결과 재현 — PASS + FAIL 흐름.

    회장 §9 — task-2506 / task-2507 / task-2509 / task-2511 4개 fixture를 회귀 입력으로 사용.
    실제 task md 파일이 있으면 그것을 우선 사용 (강한 검증), 없으면 임시 fixture로 fallback.
    zSMOKE_COMMAND_REGISTRY missing zREPLAY_FIXTURES missing merge_commit_hint0(   r>   NrL   r   z
 smoke ok
r   FTrv   zregistry fallback mismatch for rf   r   )r   r   r6   rR   )r   r   r   _REAL_FIXTURE_DIRexistsrI   r5   r   rY   r   rZ   rD   r6   r_   rR   r`   rj   rk   r   rl   r   )rC   r6   r,   fixture_metar   real_mdrb   pass_runnerrun_passfail_runnerrun_fails              r   test_11_replay_fixtures_passr   :  s
    !
)C;1';;3"7+L=3G9==<
*
+cR#lK^>_:`5`.a
aC  WIS/1G )g~h_c/dG #a7);8OPK#UTH ??k.....!!S(U,KG9*UU(w&&&&&$...  C'''&&& #a?K#UTH ??k.....w&&&***..2H2`2````''	2g===''73>>>r   c                   d}t        | dd      }t        ||dt        d      d	      }|j                  du sJ t        ||dt        d
      d	      }|j                  du sJ t        ||dt        d      d	      }|j                  du sJ t        | dd       }t        ||dt        d      d	      }|j                  du sJ t        ||dt        d      d	      }|j                  du sJ t        dd      }	t        ||d|	d	      }
|
j                  t
        j                  k(  sJ |
j                  du sJ |
j                  du sJ y )N(ccc0000000000000000000000000000000000000z
task-9012arK   rL   Fr   rt   Trv   rf   )r#   z
task-9012br*   )r   r$   )rI   r   r5   r_   rY   r   rZ   r   )rC   r   task_md_passpass_runfail_runto_runtask_md_skipskip_runblk_runstale_runner	stale_runs              r   +test_12_continuation_signals_for_all_statesr   k  s   
C!(LTL#S%1-H &&$... $S%1-H &&%/// "S%d3dF $$--- "(LML#S$1-H &&$... #S%1-G %%... $qXFL$S%eI {/////??d"""''5000r   )r   r   r   r   r   r   r#   boolr$   Optional[str]r%   r   r   )rC   r   r6   r   rD   r   returnr   )4__doc__
__future__r   r   r/   syspathlibr   typingr   rW   __file__resolveparentsWORKTREEr   pathremoveinsertutils.automation_contractsr   r   r	   utils.post_merge_smoke_runnerr
   r   r   r   r   r   r   r5   rI   rd   rm   rr   rx   r|   r   r   r   r   r   osenvirongetparentr   markparametrizer   r   r"   r   r   <module>r      sm    #   
   >!!#++A.x=CHHHHOOCM" 3x= ! 
   +,2R*/T,-#'=J&)081*\(+$
%"%$F(F$<,%2=$ 
JJNN#S)?)?%@A 
 $XY)? Z)?`01r   