
    fMi                        U d Z ddlZddlmc mZ ddlZddl	Z	ddl
Z
ddlmZmZ ddlmZ ddlmZ ddlmZmZ ddlZej*                  j-                  d ee      j0                  j0                  dz        Zg ZdZeeuZeZerej<                  ZdZ ee uZ!e!ZesB ejD                  d	efd
eef      d ejF                         v s ejH                  e      r ejJ                  e      nd ejJ                  e      dz  Z&dde&iz  Z'ejQ                  e'       er ejD                  d	e!fdee f      d ejF                         v s ejH                  e      r ejJ                  e      nd ejJ                  e       ejJ                  e       dz  Z)dde)iz  Z*ejQ                  e*        ejV                  ed      i z  Z,dde,iz  Z- e. ej^                  e-            dxZxZxZxZxZxZ!Z ej*                  ja                  e      Z1ee2d<   ej<                  jg                  e1        G d d      Z4 G d d      Z5 G d d      Z6 G d d      Z7 G d d      Z8y) uR   
tests for canary-test.py

[task-794.1] P6-1 canary 테스트 스크립트 검증
    N)datetime	timedelta)Path)Any)	MagicMockpatchcanary_testzcanary-test.py)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py16zassert %(py19)spy19ctc                   0    e Zd ZdZdeddfdZdeddfdZy)TestSaveCanaryStatusu#   save_canary_status 함수 테스트tmp_pathreturnNc                 |   ddddddddg}t        j                  t        d|d	z        5  t        j                  t        d
|      5  t        j                  |d       ddd       ddd       t	        j
                  |d	z  j                               }|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   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|d   }	t        |	      }d}
||
k(  }|st        j                  d|fd||
f      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |	      t        j                  |      t        j                  |
      dz  }dd|iz  }t        t        j                  |            dx}	x}x}}
d}||v }|st        j                  d |fd!||f      t        j                  |      d"t        j                         v st        j                  |      rt        j                  |      nd"d#z  }d$d%|iz  }t        t        j                  |            dx}}y# 1 sw Y   GxY w# 1 sw Y   LxY w)&u3   결과가 올바른 필드로 JSON에 저장된다.test1Toktestpasseddetailtest2Fzfail reasonCANARY_STATUS_JSONcanary-status.json
MEMORY_DIR
all_passedNr%   isz%(py1)s is %(py4)spy1py4assert %(py6)spy6
pass_count   ==z%(py1)s == %(py4)s
fail_countresults   )z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)slen)py0r   r+   r   assert %(py9)sr   last_runinz%(py1)s in %(py3)ssavedr*   py3assert %(py5)sr   )r   objectr   save_canary_statusjsonloads	read_text
@pytest_ar_call_reprcompare	_safereprAssertionError_format_explanationr6   @py_builtinslocals_should_repr_global_name)selfr   r4   r=   @py_assert0@py_assert3@py_assert2@py_format5@py_format7@py_assert1@py_assert6@py_assert5@py_format8@py_format10@py_format4@py_format6s                   5/home/jay/workspace/scripts/tests/test_canary_test.py#test_saves_json_with_correct_fieldsz8TestSaveCanaryStatus.test_saves_json_with_correct_fields   s    =G
 \\"2H?S4ST 	Ab,9 A%%g%%@A	A 

H';;FFHI\"+e+"e++++"e+++"+++e+++++++\"'a'"a''''"a'''"'''a'''''''\"'a'"a''''"a'''"'''a'''''''#)s#$))$))))$))))))s)))s)))#)))$))))))))))"zU""""zU"""z""""""U"""U"""""""A A	A 	As#   N1N$N1$N.	)N11N;c                 T   ddddg}t        j                  t        d|dz        5  t        j                  t        d|      5  t        j                  |d       d	d	d	       d	d	d	       t	        j
                  |dz  j                               }|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   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}}y	# 1 sw Y   8xY w# 1 sw Y   =xY w)u+   모든 테스트 통과 시 all_passed=Truet1Tr   r   r!   r"   r#   r$   Nr%   r&   r(   r)   r,   r-   r3   r   r0   r2   )r   rA   r   rB   rC   rD   rE   rF   rG   rH   rI   rJ   )	rN   r   r4   r=   rO   rP   rQ   rR   rS   s	            r[   %test_all_passed_true_when_no_failuresz:TestSaveCanaryStatus.test_all_passed_true_when_no_failures/   sF    TT:
 \\"2H?S4ST 	@b,9 @%%g$%?@	@ 

H';;FFHI\"*d*"d****"d***"***d*******\"'a'"a''''"a'''"'''a'''''''@ @	@ 	@s#   FFFF	FF')__name__
__module____qualname____doc__r   r\   r_        r[   r   r      s+    -#D #T #"(d (t (re   r   c                   0    e Zd ZdZdeddfdZdeddfdZy)TestWriteLogu   write_log 함수 테스트r   r   Nc                    |dz  }t        j                  t        d|      5  t        j                  t        d|      5  t        j                  d       ddd       ddd       |j                  } |       }|sddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }t        t        j                  |            dx}}d}|j                  } |       }||v }	|	st        j                  d	|	fd
||f      t        j                  |      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}	x}}y# 1 sw Y   xY w# 1 sw Y   xY w)u(   로그 파일이 없으면 생성한다.canary-test.log
CANARY_LOGLOGS_DIRz[TEST] test messageNAassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}log_pathr7   r   r+   r:   )zH%(py1)s in %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s.read_text
}()
})r*   r?   r   r   r8   r   )r   rA   r   	write_logexistsrK   rL   rF   rM   rH   rI   rJ   rE   rG   )rN   r   rm   rT   rP   rR   rO   @py_assert4rU   rQ   rW   rX   s               r[   test_creates_log_filez"TestWriteLog.test_creates_log_file@   sJ   //\\"lH5 	4b*h7 4234	4          x   x             $<(:(:<(:(<<$(<<<<<$(<<<<$<<<<<<<<<<<<(:<<<(<<<<<<<<	4 4	4 	4s"   G;G.G;.G8	3G;;Hc                    |dz  }t        j                  t        d|      5  t        j                  t        d|      5  t        j                  t        dd      5  t        d      D ]  }t        j	                  d|         	 ddd       ddd       ddd       |j                         j                         }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                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            dx}x}}y# 1 sw Y   IxY w# 1 sw Y   NxY w# 1 sw Y   SxY w)u9   LOG_KEEP_LINES 초과 시 마지막 N줄만 유지한다.ri   rj   rk   LOG_KEEP_LINES   
   zline N)<=)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} <= %(py6)sr6   lines)r7   r*   r?   r-   zassert %(py8)spy8)r   rA   r   rangero   rE   
splitlinesr6   rF   rG   rK   rL   rM   rH   rI   rJ   )
rN   r   rm   irx   rQ   rV   rq   rS   @py_format9s
             r[   test_trims_to_max_linesz$TestWriteLog.test_trims_to_max_linesJ   sF   //\\"lH5 	2b*h7 2\\"&6: 2"2Y 2uQC[1222	2 ""$//15zQzQzQss55zQ2 22 2	2 	2s:   G$G)G
GG$
GGG!	G$$G.)r`   ra   rb   rc   r   rr   r~   rd   re   r[   rg   rg   =   s+    $=d =t =
 
 
re   rg   c                   0    e Zd ZdZdeddfdZdeddfdZy)TestTaskTimersJsonRwu)   test_task_timers_json_rw 함수 테스트r   r   Nc                 ~   |dz  }|j                  t        j                  di i             t        j                  t
        d|      5  t
        j                         \  }}ddd       d}|u }|st        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  }t        t        j                  |            dx}}d}	|	v }|st        j                  d|fd|	|f      t        j                  |	      dt        j                         v st        j                  |      rt        j                  |      nddz  }d
d|iz  }t        t        j                  |            dx}	}y# 1 sw Y   UxY w)u9   task-timers.json이 존재하고 쓰기 가능하면 PASSztask-timers.jsontasksTASK_TIMERS_JSONNTr&   z%(py0)s is %(py3)sr   r7   r?   r@   r   u   정상r:   r<   r   r>   )
write_textrC   dumpsr   rA   r   test_task_timers_json_rwrF   rG   rK   rL   rM   rH   rI   rJ   )
rN   r   timers_pathr   r   rQ   rT   rY   rZ   rO   s
             r[   'test_pass_when_file_exists_and_writablez<TestTaskTimersJsonRw.test_pass_when_file_exists_and_writableZ   s   !33tzz7B-89\\"0+> 	;88:NFF	; v~vvv!x6!!!!x6!!!x!!!!!!6!!!6!!!!!!!		; 	;s   F22F<c                    |dz  }t        j                  t        d|      5  t        j                         \  }}ddd       d}|u }|st	        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  }t        t	        j                  |            dx}}y# 1 sw Y   xY w)u   파일이 없으면 FAILzmissing.jsonr   NFr&   r   r   r   r@   r   )r   rA   r   r   rF   rG   rK   rL   rM   rH   rI   rJ   )	rN   r   missingr   r   rQ   rT   rY   rZ   s	            r[   test_fail_when_file_missingz0TestTaskTimersJsonRw.test_fail_when_file_missinge   s    ^+\\"0': 	;88:NFF	; vvvv	; 	;s   C''C0)r`   ra   rb   rc   r   r   r   rd   re   r[   r   r   W   s+    3	" 	" 	"D T re   r   c                   0    e Zd ZdZdeddfdZdeddfdZy)TestEventsDirWritableu)   test_events_dir_writable 함수 테스트r   r   Nc                    t        j                  t        d|dz        5  t        j                         \  }}ddd       d}|u }|st	        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  }t        t	        j                  |            dx}}y# 1 sw Y   xY w)u%   쓰기 가능한 디렉토리면 PASS
EVENTS_DIReventsNTr&   r   r   r   r@   r   )r   rA   r   test_events_dir_writablerF   rG   rK   rL   rM   rH   rI   rJ   )rN   r   r   r   rQ   rT   rY   rZ   s           r[   test_pass_when_dir_writablez1TestEventsDirWritable.test_pass_when_dir_writableq   s    \\"lHx,?@ 	;88:NFF	; v~vvv	; 	;s   C%%C.c                 :   |dz  dz  }t        j                  t        d|      5  t        j                         \  }}ddd       d}|u }|st	        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  }t        t	        j                  |            dx}}|j                  } |       }	|	sddt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      t	        j                  |	      dz  }
t        t	        j                  |
            dx}}	y# 1 sw Y   VxY w)u0   디렉토리가 없어도 자동 생성 후 PASSnonexistentr   r   NTr&   r   r   r   r@   r   rl   
events_dirrn   )r   rA   r   r   rF   rG   rK   rL   rM   rH   rI   rJ   rp   )rN   r   r   r   r   rQ   rT   rY   rZ   rP   rR   s              r[    test_pass_creates_dir_if_missingz6TestEventsDirWritable.test_pass_creates_dir_if_missingx   s    -8
\\"lJ7 	;88:NFF	; v~vvv  " """"""""z"""z""" """"""""""		; 	;s   FF)r`   ra   rb   rc   r   r   r   rd   re   r[   r   r   n   s+    3D T # #$ #re   r   c                   (    e Zd ZdZddZddZddZy)TestStaleRunningTasksu)   test_stale_running_tasks 함수 테스트Nc                 *   t               }d|_        t        j                  dg d      |_        d|_        t        d|      5  t        j                         \  }}ddd       d}|u }|st        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  }t        t        j                   |            dx}}y# 1 sw Y   xY w)u$   실행 중인 task가 없으면 PASSr   totalr    subprocess.runreturn_valueNTr&   r   r   r   r@   r   )r   
returncoderC   r   stdoutstderrr   r   test_stale_running_tasksrF   rG   rK   rL   rM   rH   rI   rJ   rN   mock_resultr   r   rQ   rT   rY   rZ   s           r[   test_returns_pass_on_no_tasksz3TestStaleRunningTasks.test_returns_pass_on_no_tasks   s    k!"!ZZ!b(AB#+> 	;88:NFF	; v~vvv	; 	;s   D		Dc                    t        j                         t        d      z
  j                         }t	               }d|_        t        j                  dd|dgd      |_        d|_	        t        d	|
      5  t        j                         \  }}ddd       d}|u }|st        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  }t'        t        j(                  |            dx}}d}	|	v }|st        j                  d|fd|	|f      t        j$                  |	      dt        j                          v st        j"                  |      rt        j$                  |      nddz  }dd|iz  }t'        t        j(                  |            dx}	}y# 1 sw Y   UxY w)uT   24시간 이상 running인 작업이 있으면 stale로 감지 (PASS, 감지 성공)   )hoursr   r/   ztask-9999.1)task_id
start_timer   r   r   r   NTr&   r   r   r   r@   r   staler:   r<   r   r>   )r   nowr   	isoformatr   r   rC   r   r   r   r   r   r   rF   rG   rK   rL   rM   rH   rI   rJ   )
rN   old_timer   r   r   rQ   rT   rY   rZ   rO   s
             r[   test_detects_stale_taskz-TestStaleRunningTasks.test_detects_stale_task   s;   LLNYR%88CCEk!"!ZZ!=hp?q>r(st#+> 	;88:NFF	; v~vvv w&    w&   w      &   &       		; 	;s   6G!!G+c                    t               }d|_        d|_        d|_        t	        d|      5  t
        j                         \  }}ddd       d}|u }|st        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  }t        t        j                  |            dx}}y# 1 sw Y   xY w)u   task-timer.py 오류 시 FAILr/   r   zerror messager   r   NFr&   r   r   r   r@   r   )r   r   r   r   r   r   r   rF   rG   rK   rL   rM   rH   rI   rJ   r   s           r[   test_fail_on_timer_errorz.TestStaleRunningTasks.test_fail_on_timer_error   s    k!",#+> 	;88:NFF	; vvvv	; 	;s   C33C<)r   N)r`   ra   rb   rc   r   r   r   rd   re   r[   r   r      s    3
!
re   r   )9rc   builtinsrK   _pytest.assertion.rewrite	assertionrewriterF   importlib.util	importlibrC   sysr   r   pathlibr   typingr   unittest.mockr   r   pytestutilspec_from_file_location__file__parentr   rT   rq   rP   rO   loader@py_assert10@py_assert13@py_assert12rG   rL   rM   rH   rZ   rW   append@py_format15@py_format17_format_boolop@py_format18@py_format20rI   rJ   module_from_specr   __annotations__exec_moduler   rg   r   r   r   rd   re   r[   <module>r      s       
 (   *  	..N  #33	 6D 5uD 5U\\ 5 5\5 5 5 5uD 5 5 5 5 5u 5 5 5u 5 5 5D 5 5 5 5 5 5 5\ 5 5 5 5 5U 5 5 5U 5 5 5\ 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
..
)
)%
0C 0    ( (D 4 .# #(' 're   