
     Li                     *   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 ddlZej                  j                  d e ee      j"                  j"                  j"                               ddlmZmZmZ  G d d      Z G d d      Z G d	 d
      Zy)u&   utils/interrupt.py 테스트 스위트    N)Path)	INTERRUPTInterruptFlagregister_signal_handlerc                   4    e Zd ZdZd Zd Zd Zd Zd Zd Z	y)	TestInterruptFlagu(   InterruptFlag 클래스 단위 테스트c                    t               }|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                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}x}}y)	u   생성 직후 is_set()은 FalseFiszE%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.is_set
}()
} is %(py7)sflagpy0py2py4py7assert %(py9)spy9N)
r   is_set
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationselfr   @py_assert1@py_assert3@py_assert6@py_assert5@py_format8@py_format10s           1/home/jay/workspace/utils/tests/test_interrupt.pytest_initial_state_is_not_setz/TestInterruptFlag.test_initial_state_is_not_set   s    {{%{}%%}%%%%}%%%%%%t%%%t%%%{%%%}%%%%%%%%%%    c                     t               }|j                          |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                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}x}}y)	u!   set() 호출 후 is_set()은 TrueTr
   r   r   r   r   r   Nr   setr   r   r   r   r   r   r   r   r   r   s           r&   test_set_makes_is_set_truez,TestInterruptFlag.test_set_makes_is_set_true   s    
{{${}$$}$$$$}$$$$$$t$$$t$$${$$$}$$$$$$$$$$r(   c                     t               }|j                          |j                          |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                  |      t	        j                  |      dz  }dd|iz  }t        t	        j                  |            dx}x}x}}y)	u$   reset() 호출 후 is_set()은 FalseFr
   r   r   r   r   r   N)r   r+   resetr   r   r   r   r   r   r   r   r   r   s           r&   test_reset_clears_flagz(TestInterruptFlag.test_reset_clears_flag   s    


{{%{}%%}%%%%}%%%%%%t%%%t%%%{%%%}%%%%%%%%%%r(   c                     t               }|j                          |j                          |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                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}x}}y)	u,   set()을 여러 번 호출해도 True 유지Tr
   r   r   r   r   r   Nr*   r   s           r&   test_set_is_idempotentz(TestInterruptFlag.test_set_is_idempotent%   s    

{{${}$$}$$$$}$$$$$$t$$$t$$${$$$}$$$$$$$$$$r(   c                     t               }|j                          |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                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}x}}y)	u)   set() 없이 reset() 해도 오류 없음Fr
   r   r   r   r   r   N)r   r.   r   r   r   r   r   r   r   r   r   r   s           r&   test_reset_without_setz(TestInterruptFlag.test_reset_without_set,   s    

{{%{}%%}%%%%}%%%%%%t%%%t%%%{%%%}%%%%%%%%%%r(   c                 
  
 t               g 

fd}t        d      D cg c]  }t        j                  |       }}|D ]  }|j	                           |D ]  }|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c c}w )u'   멀티 스레드에서 set/reset 안전c                      	 t        d      D ]2  } j                          j                          j                          4 y # t        $ r}j                  |       Y d }~y d }~ww xY w)Nd   )ranger+   r   r.   	Exceptionappend)_eerrorsr   s     r&   workerz4TestInterruptFlag.test_thread_safety.<locals>.worker7   sW    !s !AHHJKKMJJL!  !a  !s   A A 	A(A##A(   )targetr   )==)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slenr<   )r   py1py3py6zassert %(py8)spy8N)r   r7   	threadingThreadstartjoinrA   r   r   r   r   r   r   r   r   )r   r=   r:   threadst@py_assert2r#   @py_assert4@py_format7@py_format9r<   r   s             @@r&   test_thread_safetyz$TestInterruptFlag.test_thread_safety2   s    "$	! =B!HEq9##62EE 	AGGI	 	AFFH	 6{a{a{ass66{a Fs   F N)
__name__
__module____qualname____doc__r'   r,   r/   r1   r3   rP    r(   r&   r   r      s#    2&
%&%& r(   r   c                   (    e Zd ZdZd Zd Zd Zd Zy)TestGlobalInterruptu*   글로벌 INTERRUPT 인스턴스 테스트c                 ,    t        j                          y Nr   r.   r   s    r&   setup_methodz TestGlobalInterrupt.setup_methodL       r(   c                 \   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                  t              rt        j                  t              nddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }t        t        j                  |            d}y)u8   INTERRUPT 글로벌 인스턴스가 InterruptFlag 타입z5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}
isinstancer   r   )r   rB   r   r   N)
r_   r   r   r   r   r   r   r   r   r   )r   r!   @py_format5s      r&   test_global_instance_existsz/TestGlobalInterrupt.test_global_instance_existsO   s    )]33333333z333z333333)333)333333]333]3333333333r(   c                    t         j                  } |       }d}||u }|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}}y)	u   초기 상태는 미설정Fr
   r   r   r   r   r   N)
r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   s          r&   &test_global_instance_initially_not_setz:TestGlobalInterrupt.test_global_instance_initially_not_setS   s    *!*U*!U****!U******y***y******!***U*******r(   c                    t        j                          t         j                  } |       }d}||u }|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}}t        j                          t         j                  } |       }d	}||u }|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}}y)
u'   글로벌 인스턴스 set/reset 동작Tr
   r   r   r   r   r   NF)r   r+   r   r   r   r   r   r   r   r   r   r.   rc   s          r&   test_global_set_and_resetz-TestGlobalInterrupt.test_global_set_and_resetW   s#   )!)T)!T))))!T))))))y)))y))))))!)))T)))))))*!*U*!U****!U******y***y******!***U*******r(   N)rQ   rR   rS   rT   r\   ra   rd   rf   rU   r(   r&   rW   rW   I   s    44++r(   rW   c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)TestRegisterSignalHandleru#   register_signal_handler() 테스트c                 ,    t        j                          y rY   rZ   r[   s    r&   r\   z&TestRegisterSignalHandler.setup_methodb   r]   r(   c                     t        j                   t         j                  t         j                         t        j                   t         j                  t         j                         t	        j
                          y)u,   시그널 핸들러 복원 (기본값으로)N)signalSIGINTSIG_DFLSIGTERMr   r.   r[   s    r&   teardown_methodz)TestRegisterSignalHandler.teardown_methode   s8    fmmV^^4fnnfnn5r(   c                     t                y)u2   register_signal_handler() 호출 시 예외 없음N)r   r[   s    r&   test_register_does_not_raisez6TestRegisterSignalHandler.test_register_does_not_raisek   s    !r(   c                 >   t                t        j                  t        j                         t        j
                  } |       }d}||u }|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}}y)	u,   SIGINT 수신 시 INTERRUPT.is_set() == TrueTr
   r   r   r   r   r   N)r   rk   raise_signalrl   r   r   r   r   r   r   r   r   r   r   rc   s          r&   test_sigint_sets_interruptz4TestRegisterSignalHandler.test_sigint_sets_interrupto   s    !FMM*)!)T)!T))))!T))))))y)))y))))))!)))T)))))))r(   c                 >   t                t        j                  t        j                         t        j
                  } |       }d}||u }|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}}y)	u-   SIGTERM 수신 시 INTERRUPT.is_set() == TrueTr
   r   r   r   r   r   N)r   rk   rs   rn   r   r   r   r   r   r   r   r   r   r   rc   s          r&   test_sigterm_sets_interruptz5TestRegisterSignalHandler.test_sigterm_sets_interruptv   s    !FNN+)!)T)!T))))!T))))))y)))y))))))!)))T)))))))r(   N)	rQ   rR   rS   rT   r\   ro   rq   rt   rv   rU   r(   r&   rh   rh   _   s    -"**r(   rh   )rT   builtinsr   _pytest.assertion.rewrite	assertionrewriter   rk   sysrF   pathlibr   pytestpathinsertstr__file__parentutils.interruptr   r   r   r   rW   rh   rU   r(   r&   <module>r      sm    ,    
    3tH~,,33::; < M M6  6 r+ +,* *r(   