
    9j                       d Z ddlmZ ddlZddlmc mZ ddl	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'                  d ee             ddlmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z# d Z$d Z%d	 Z&d
 Z'd Z(d Z)d Z*d Z+d Z,d Z-d Z.d Z/d Z0d Z1y)u#  task-2556 §9 supporting — polling_policy 코드 게이트 단독 회귀.

회장 §명시 2026-05-12 §9: "long polling 금지 — 5~15min normal wait / 30min first timeout /
1회 recheck / 봇 종료" 의 정책 코드 게이트가 각 단위 함수에서 정상 동작하는지 검증.
    )annotationsN)Path   )BotSessionExitRequiredFIRST_TIMEOUT_SECONDSLongPollingViolationMAX_RECHECKSMAX_SINGLE_SLEEP_SECONDSNORMAL_WAIT_MAX_SECONDSNORMAL_WAIT_MIN_SECONDSPollingStateSchedulerCycleBudgetadvance_recheck!assert_first_timeout_not_exceededassert_normal_waitassert_sleep_allowedconsume_sleep_budgetmust_exit_nowc                    d} d}| |z  }t         |k(  }|st        j                  d|fdt         |f      dt        j                         v st        j
                  t               rt        j                  t               ndt        j                  |       t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x} x}}d
} d}| |z  }t        |k(  }|st        j                  d|fdt        |f      dt        j                         v st        j
                  t              rt        j                  t              ndt        j                  |       t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x} x}}d} t        | k(  }|st        j                  d|fdt        | f      dt        j                         v st        j
                  t              rt        j                  t              ndt        j                  |       dz  }dd|iz  }t        t        j                  |            d	x}} d} d}| |z  }t        |k(  }|st        j                  d|fdt        |f      dt        j                         v st        j
                  t              rt        j                  t              ndt        j                  |       t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x} x}}d} d}| |z  }t        |k(  }|st        j                  d|fdt        |f      dt        j                         v st        j
                  t              rt        j                  t              ndt        j                  |       t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x} x}}y	)uN   회장 §9 1:1: MAX 900s (15분), FIRST_TIMEOUT 1800s (30분), MAX_RECHECKS 1.   <   ==)z%(py0)s == (%(py3)s * %(py5)s)r
   )py0py3py5assert %(py8)spy8N   r      )z%(py0)s == %(py3)sr	   )r   r   zassert %(py5)sr      r   r   )r
   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationr   r	   r   r   )@py_assert2@py_assert4@py_assert6@py_assert1@py_format7@py_format9@py_format4@py_format6s           I/home/jay/workspace/anu_v2/tests/test_polling_policy_long_polling_gate.py"test_constants_match_chairman_specr3   &   s3   ').B.rBw.#w....#w......#...#...r...B.......$&++BG+ G++++ G++++++ +++ +++B++++++++++<1<1<<1&',",a"f,"f,,,,"f,,,,,,",,,",,,a,,,",,,,,,,&(-2-b2g-"g----"g------"---"---b---2-------    c                     t        j                  t              5  t        t        dz          d d d        y # 1 sw Y   y xY wNr    )pytestraisesr   r   r
    r4   r2   ,test_assert_sleep_allowed_rejects_over_15minr:   /   s2    	+	, ;59:; ; ;   6?c                 Z   t        j                  t              5  t        d       d d d        t        j                  t              5  t        d       d d d        t        j                  t              5  t        d       d d d        y # 1 sw Y   dxY w# 1 sw Y   CxY w# 1 sw Y   y xY w)Ng      ?T)r7   r8   r   r   r9   r4   r2   6test_assert_sleep_allowed_rejects_negative_and_non_intr>   4   s    	+	, !R !	+	, "S!"	+	, #T"# #	! !" "# #s#   B	B4B!	BB!B*c                 "    t        t               y )N)r   r
   r9   r4   r2   -test_assert_sleep_allowed_accepts_15min_exactr@   =   s    12r4   c                     t        j                  t              5  t        t        dz
         d d d        y # 1 sw Y   y xY wr6   )r7   r8   r   r   r   r9   r4   r2   #test_assert_normal_wait_lower_boundrB   A   2    	+	, 82Q678 8 8r;   c                     t        j                  t              5  t        t        dz          d d d        y # 1 sw Y   y xY wr6   )r7   r8   r   r   r   r9   r4   r2   #test_assert_normal_wait_upper_boundrE   F   rC   r;   c                 r    t        t               t        t               t        t        t        z   dz         y )Nr   )r   r   r   r9   r4   r2   #test_assert_normal_wait_in_range_okrG   K   s(    ././/2IIaOPr4   c                     t        d       t        t               t        j                  t              5  t        t        dz          d d d        y # 1 sw Y   y xY w)Nr   r    )r   r   r7   r8   r   r9   r4   r2   !test_first_timeout_30min_boundaryrI   Q   sG    %a(%&;<	+	, E)*?!*CDE E Es   AAc                 4   t        d      } t        |       }|j                  }d}||k(  }|st        j                  d|fd||f      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}}t        j                  t              5  t        |       d d d        y # 1 sw Y   y xY w)
Nr   )rechecks_doner    r   )z5%(py2)s
{%(py2)s = %(py0)s.rechecks_done
} == %(py5)ss1)r   py2r   zassert %(py7)spy7)r   r   rK   r"   r#   r$   r%   r&   r'   r(   r)   r7   r8   r   )s0rL   r-   r+   @py_assert3r1   @py_format8s          r2   )test_advance_recheck_increments_until_maxrR   X   s    	A	&B		B q q    q      2   2      q       	-	.   s   9DDc                 J   t        dt        dz         } t        |       }d}||u }|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 )Nr   r    rK   elapsed_secondsTisz0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} is %(py6)sr   sr   py1r   py6r   r   )r   r   r   r"   r#   r$   r%   r&   r'   r(   r)   rY   r*   @py_assert5r+   r.   r/   s         r2   1test_must_exit_now_for_elapsed_over_first_timeoutr_   `   s    16Ka6OPA#t#t####t######=###=###############t#######r4   c                 <   t        dd      } t        |       }d}||u }|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 )Nr   X  rT   FrV   rX   r   rY   rZ   r   r   )
r   r   r"   r#   r$   r%   r&   r'   r(   r)   r]   s         r2   )test_must_exit_now_for_normal_state_falserb   e   s    1c:A$u$u$$$$u$$$$$$=$$$=$$$$$$$$$$$$$$$u$$$$$$$r4   c                    d} t        |       }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}}d	} t        |       }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	)
u3   비 PollingState 입력 시 안전망: exit 강제.not a stateTrV   )z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} is %(py7)sr   )r   rM   py4rN   zassert %(py9)spy9N)	r   r"   r#   r$   r%   r&   r'   r(   r)   )r-   rP   r,   r^   rQ   @py_format10s         r2   5test_must_exit_now_for_non_polling_state_returns_truerh   j   s   &/='/4/'4////'4//////=///=//////'///4///////&=&$&$&&&&$&&&&&&=&&&=&&&&&&&&&$&&&&&&&r4   c                     t               } t        | d      } t        | d      } t        j                  t              5  t        | d       d d d        y # 1 sw Y   y xY w)Nra   i,  r    )r   r   r7   r8   r   )bs    r2   .test_consume_sleep_budget_cumulative_violationrk   p   sN    AQ$AQ$A	+	, #Q"# # #s   AAc                 v    t        j                  t              5  t        d       d d d        y # 1 sw Y   y xY w)Nrd   )r7   r8   r   r   r9   r4   r2   &test_advance_recheck_rejects_non_staterm   x   s,    	+	, '&' ' 's   /8)2__doc__
__future__r   builtinsr$   _pytest.assertion.rewrite	assertionrewriter"   syspathlibr   r7   __file__resolveparentsWORKSPACE_ROOTstrpathinsertanu_v2.polling_policyr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r3   r:   r>   r@   rB   rE   rG   rI   rR   r_   rb   rh   rk   rm   r9   r4   r2   <module>r~      s    #   
   h'')11!4~chh&HHOOAs>*+    &.;
#38
8
QE$
%
'#'r4   