
    i                        d 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
mZ ddlmZ  ee      j                  j                  dz  dz  Zej"                  j%                  de      Zej"                  j)                  e      Zej,                  j/                  e       ej0                  Zded	ed
efdZde
d
efdZded
dfdZded
dfdZded
dfdZded
dfdZ ded
dfdZ!ded
dfdZ"y)u"   orphan-watchdog.py 테스트 (TDD)    N)datetime	timedelta)Pathscriptszorphan-watchdog.pyorphan_watchdogtmp_pathtasksreturnc                 `    | dz  }|j                  t        j                  d|i      d       |S )u/   임시 task-timers.json 파일을 생성한다.ztask-timers.jsonr	   zutf-8)encoding)
write_textjsondumps)r   r	   
timer_files      1/home/jay/workspace/tests/test_orphan_watchdog.py_make_timer_filer      s4    ..J$**gu%56I    dtc                 "    | j                         S )N)	isoformat)r   s    r   _isor      s    <<>r   c           	         t        j                         }ddt        |t        d      z
        ddddt        |t        d	      z
        ddd
}t	        | |      }t        |      }|d   }g }||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}||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)uM   모든 태스크가 completed 상태이면 zombies 리스트는 비어있다.task-1.1	dev1-teamZ   minutes	completedtask_idteam_id
start_timestatustask-1.2	dev2-teamx   )r   r$   r   zombies==z%(py1)s == %(py4)spy1py4assert %(py6)spy6Ntotalr   
checked_atinz%(py1)s in %(py3)sresultr-   py3assert %(py5)spy5)r   nowr   r   r   detect_zombies
@pytest_ar_call_reprcompare	_safereprAssertionError_format_explanation@py_builtinslocals_should_repr_global_name)r   r;   r	   r   r6   @py_assert0@py_assert3@py_assert2@py_format5@py_format7@py_format4@py_format6s               r   test_no_zombiesrL      si   
,,.C ""sYr%::;!	
 ""sYs%;;<!	
E "(E2Jz2F)"""""""""""""""""""'?a?a?a?a!<6!!!!<6!!!<!!!!!!6!!!6!!!!!!!r   c                    t        j                         }|t        d      z
  }ddddt        |      ddi}t	        | |      }t        |      }|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   }|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   }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        |      }||k(  }|st        j                  d|fd||f      t        j                  |      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                  |      dz  }
dd|
iz  }t        t        j                  |            dx}x}}y)uL   'started' 상태이고 90분 경과한 태스크는 zombies에 포함된다.r   r   z
task-414.1r   u   좀비 태스크started)r    r!   descriptionr"   r#   r'   r1      r)   r+   r,   r/   r0   Nr(   r   r    r!   elapsed_minutes>=z%(py1)s >= %(py4)sr"   )z0%(py1)s == %(py6)s
{%(py6)s = %(py3)s(%(py4)s)
}r   start)r-   r8   r.   r0   zassert %(py8)spy8)r   r;   r   r   r   r<   r=   r>   r?   r@   rA   rB   rC   rD   )r   r;   rU   r	   r   r6   rE   rF   rG   rH   rI   zombie@py_assert5@py_format9s                 r   test_detect_zombierZ   5   s>   
,,.C)B''E#"-u+
E "(E2Jz2F'?a?a?a?aIq!F),,,,,,,,,,,,,,,,,,,)+++++++++++++++++++#$**$****$***$**********,.4;.;....;.........4...4............;.......r   c           	         t        j                         }dddt        |t        d      z
        ddi}t	        | |      }t        |      }|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   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   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)uC   'running' 상태도 started와 동일하게 좀비로 감지된다.z
task-500.1z	dev3-teamK   r   runningr   r'   r1   rP   r)   r+   r,   r/   r0   Nr(   r   r    rQ   rR   rT   r   r;   r   r   r   r<   r=   r>   r?   r@   rA   
r   r;   r	   r   r6   rE   rF   rG   rH   rI   s
             r   !test_running_status_also_detectedr`   M   sV   
,,.C#"sYr%::;	
E "(E2Jz2F'?a?a?a?a)Q	*:l:*l::::*l:::*:::l:::::::)Q 128b82b88882b8882888b8888888r   c           	         t        j                         }dddt        |t        d      z
        ddi}t	        | |      }t        |      }|d   }g }||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}}y)ug   started 상태이지만 30분밖에 경과하지 않은 태스크는 zombies에 포함되지 않는다.z
task-600.1r%      r   rN   r   r'   r(   r)   r+   r,   r/   r0   Nr1   r   r^   r_   s
             r    test_within_threshold_not_zombierc   `   s    
,,.C#"sYr%::;	
E "(E2Jz2F)"""""""""""""""""""'?a?a?a?ar   c                 p   | dz  }t        |      }|d   }g }||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}||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	)u@   task-timers.json 파일이 없으면 빈 결과를 반환한다.zno-such-file.jsonr'   r(   r)   r+   r,   r/   r0   Nr1   r   r2   r3   r5   r6   r7   r9   r:   )	r<   r=   r>   r?   r@   rA   rB   rC   rD   )
r   non_existentr6   rE   rF   rG   rH   rI   rJ   rK   s
             r   test_file_not_existsrf   r   s   11L|4F)"""""""""""""""""""'?a?a?a?a!<6!!!!<6!!!<!!!!!!6!!!6!!!!!!!r   c           	         t        j                         }dddt        |t        d      z
        ddi}t	        | |      }t        |d      }|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}}t        |d      }
|
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
   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)uD   threshold_minutes 파라미터로 임계값을 조정할 수 있다.z
task-700.1r   -   r   rN   r   <   )r   threshold_minutesr1   r   r)   r+   r,   r/   r0   Nrb   rP   r(   r    r^   )r   r;   r	   r   result_defaultrE   rF   rG   rH   rI   result_customs              r   test_custom_thresholdrm   |   sa   
,,.C#"sYr%::;	
E "(E2J $zRPN'"'a'"a''''"a'''"'''a''''''' #jBOM!&Q&!Q&&&&!Q&&&!&&&Q&&&&&&&#A&y1A\A1\AAAA1\AAA1AAA\AAAAAAAr   )#__doc__builtinsrB   _pytest.assertion.rewrite	assertionrewriter=   importlib.util	importlibr   r   r   pathlibr   __file__parent_SCRIPT_PATHutilspec_from_file_location_specmodule_from_spec_modloaderexec_moduler<   dictr   strr   rL   rZ   r`   rc   rf   rm    r   r   <module>r      s%   (      (  H~$$++i7:NN../@,O~~&&u-    $$t D T X # "d "t "2/ /$ /09 9 9& t    $"4 "D "BD BT Br   