
    (Ti                     n   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e      j                  j                  dz  Zej"                  j%                  de      Zg ZdZeeuZeZerej0                  ZdZeeuZeZesB ej8                  defdeef      d ej:                         v s ej<                  e      r ej>                  e      nd ej>                  e      d	z  Z d
de iz  Z!ejE                  e!       er ej8                  defdeef      d ej:                         v s ej<                  e      r ej>                  e      nd ej>                  e       ej>                  e      dz  Z#dde#iz  Z$ejE                  e$        ejJ                  ed      i z  Z&dde&iz  Z' e( ejR                  e'            dxZxZxZxZxZxZZej"                  jU                  e      Z+ej0                  jY                  e+       dZ-dZ. G d d      Z/ G d d      Z0 G d d      Z1 G d d      Z2y)uw  
two_pass_audit.py의 threading regex 수정 검증 테스트.

수정 전: threading backslash-dot w+(?!Lock|RLock|Event|Semaphore)
  -> \w+가 "Event" 소비 후 lookahead가 "(" 위치에서 평가 -> 오탐

수정 후: threading backslash-dot (?!Lock|RLock|Event|Semaphore|Condition|Barrier)\w+
  -> lookahead가 \w+ 앞에서 평가 -> Event 등을 올바르게 제외
    N)Pathtwo_pass_audit.pytwo_pass_audit_module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py19z,threading\.\w+(?!Lock|RLock|Event|Semaphore)z>threading\.(?!Lock|RLock|Event|Semaphore|Condition|Barrier)\w+c                   "    e Zd ZdZd Zd Zd Zy)TestBuggyPatternFalsePositivesuC   수정 전 패턴이 오탐(false positive)을 일으킴을 확인.c           	         t         j                  }d} |t        |      }d}||u}|s<t        j                  d|fd||f      dt        j                         v st        j                  t               rt        j                  t               ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      t        j                  |      dz  }t        j                  d      d	z   d
|iz  }t        t        j                  |            dx}x}x}x}}y)u/   버그 패턴은 threading.Event()를 오탐함e = threading.Event()Nr   zZ%(py7)s
{%(py7)s = %(py2)s
{%(py2)s = %(py0)s.search
}(%(py3)s, %(py5)s)
} is not %(py10)sreBUGGY_PATTERNpy0r	   py3r
   r   py10u6   버그 패턴은 threading.Event()를 오탐해야 함z
>assert %(py12)spy12)r   searchr   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_saferepr_format_assertmsgAssertionError_format_explanationself@py_assert1@py_assert4@py_assert6@py_assert9@py_assert8@py_format11@py_format13s           L/home/jay/workspace/teams/dev1/qc/verifiers/tests/test_two_pass_audit_fix.py test_buggy_pattern_matches_eventz?TestBuggyPatternFalsePositives.test_buggy_pattern_matches_event.   sn    II	D%<	Dm%<=	DEI	D=TI	D 	D2C2C	D=T	D 	D=CV	D 	D+C+C 	D 	D:C) 	D 	D:C) 	D 	D=CV	D 	D+C+C $	D 	D:C) $	D 	D:C) &=	D 	D:C) >	D 	D:C) FJ	D 	D2C2CC	D 	D 	D0C0C	D 	D 	D    c           	         t         j                  }d} |t        |      }d}||u}|s&t        j                  d|fd||f      dt        j                         v st        j                  t               rt        j                  t               ndt        j                  |      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}x}}y)
u3   버그 패턴은 threading.Condition()도 오탐함zc = threading.Condition()Nr   r   r   r   r   assert %(py12)sr   r   r   r   r   r   r    r!   r"   r#   r%   r&   r'   s           r0   $test_buggy_pattern_matches_conditionzCTestBuggyPatternFalsePositives.test_buggy_pattern_matches_condition4   s    yyP(CPy(CDPDPDDPPPPDDPPPPPPrPPPrPPPyPPPPPPPPPPPP(CPPPDPPPDPPPPPPPPr2   c           	         t         j                  }d} |t        |      }d}||u}|s&t        j                  d|fd||f      dt        j                         v st        j                  t               rt        j                  t               ndt        j                  |      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}x}}y)
u2   버그 패턴은 threading.Barrier(5)도 오탐함zb = threading.Barrier(5)Nr   r   r   r   r   r4   r   r5   r'   s           r0   "test_buggy_pattern_matches_barrierzATestBuggyPatternFalsePositives.test_buggy_pattern_matches_barrier8   s    yyO(BOy(BCO4OC4OOOOC4OOOOOOrOOOrOOOyOOOOOOOOOOOO(BOOOCOOO4OOOOOOOOr2   N)__name__
__module____qualname____doc__r1   r6   r8    r2   r0   r   r   +   s    MDQPr2   r   c                   4    e Zd ZdZd Zd Zd Zd Zd Zd Z	y)	 TestFixedPatternNoFalsePositivesuJ   수정 후 패턴은 안전한 threading primitive를 탐지하지 않음.c           	         t         j                  }d} |t        |      }d}||u }|s&t        j                  d|fd||f      dt        j                         v st        j                  t               rt        j                  t               ndt        j                  |      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}x}}y)
u(   threading.Event()는 탐지하지 않음r   NiszV%(py7)s
{%(py7)s = %(py2)s
{%(py2)s = %(py0)s.search
}(%(py3)s, %(py5)s)
} is %(py10)sr   FIXED_PATTERNr   r4   r   r   r   rD   r   r   r    r!   r"   r#   r%   r&   r'   s           r0   test_fixed_does_not_match_eventz@TestFixedPatternNoFalsePositives.test_fixed_does_not_match_eventE   s    yyH(?Hy(?@HDH@DHHHH@DHHHHHHrHHHrHHHyHHHHHHHHHHHH(?HHH@HHHDHHHHHHHHr2   c           	         t         j                  }d} |t        |      }d}||u }|s&t        j                  d|fd||f      dt        j                         v st        j                  t               rt        j                  t               ndt        j                  |      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}x}}y)
u'   threading.Lock()은 탐지하지 않음zlock = threading.Lock()NrA   rC   r   rD   r   r4   r   rE   r'   s           r0   test_fixed_does_not_match_lockz?TestFixedPatternNoFalsePositives.test_fixed_does_not_match_lockI   s    yyJ(AJy(ABJdJBdJJJJBdJJJJJJrJJJrJJJyJJJJJJJJJJJJ(AJJJBJJJdJJJJJJJJr2   c           	         t         j                  }d} |t        |      }d}||u }|s&t        j                  d|fd||f      dt        j                         v st        j                  t               rt        j                  t               ndt        j                  |      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}x}}y)
u(   threading.RLock()은 탐지하지 않음zrlock = threading.RLock()NrA   rC   r   rD   r   r4   r   rE   r'   s           r0   test_fixed_does_not_match_rlockz@TestFixedPatternNoFalsePositives.test_fixed_does_not_match_rlockM   s    yyL(CLy(CDLLDLLLLDLLLLLLrLLLrLLLyLLLLLLLLLLLL(CLLLDLLLLLLLLLLLr2   c           	         t         j                  }d} |t        |      }d}||u }|s&t        j                  d|fd||f      dt        j                         v st        j                  t               rt        j                  t               ndt        j                  |      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}x}}y)
u-   threading.Semaphore(5)는 탐지하지 않음zsem = threading.Semaphore(5)NrA   rC   r   rD   r   r4   r   rE   r'   s           r0   #test_fixed_does_not_match_semaphorezDTestFixedPatternNoFalsePositives.test_fixed_does_not_match_semaphoreQ       yyO(FOy(FGO4OG4OOOOG4OOOOOOrOOOrOOOyOOOOOOOOOOOO(FOOOGOOO4OOOOOOOOr2   c           	         t         j                  }d} |t        |      }d}||u }|s&t        j                  d|fd||f      dt        j                         v st        j                  t               rt        j                  t               ndt        j                  |      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}x}}y)
u,   threading.Condition()은 탐지하지 않음zcond = threading.Condition()NrA   rC   r   rD   r   r4   r   rE   r'   s           r0   #test_fixed_does_not_match_conditionzDTestFixedPatternNoFalsePositives.test_fixed_does_not_match_conditionU   rM   r2   c           	         t         j                  }d} |t        |      }d}||u }|s&t        j                  d|fd||f      dt        j                         v st        j                  t               rt        j                  t               ndt        j                  |      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}x}}y)
u+   threading.Barrier(3)는 탐지하지 않음zb = threading.Barrier(3)NrA   rC   r   rD   r   r4   r   rE   r'   s           r0   !test_fixed_does_not_match_barrierzBTestFixedPatternNoFalsePositives.test_fixed_does_not_match_barrierY   s    yyK(BKy(BCKtKCtKKKKCtKKKKKKrKKKrKKKyKKKKKKKKKKKK(BKKKCKKKtKKKKKKKKr2   N)
r9   r:   r;   r<   rF   rH   rJ   rL   rO   rQ   r=   r2   r0   r?   r?   B   s)    TIKMPPLr2   r?   c                   (    e Zd ZdZd Zd Zd Zd Zy)!TestFixedPatternDetectsRiskyUsageu=   수정 후 패턴도 위험한 threading 사용을 탐지함.c           	         t         j                  }d} |t        |      }d}||u}|s&t        j                  d|fd||f      dt        j                         v st        j                  t               rt        j                  t               ndt        j                  |      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}x}}y)
uD   threading.Thread(target=...)는 탐지함 (락 없음 경고 대상)zt = threading.Thread(target=fn)Nr   r   r   rD   r   r4   r   rE   r'   s           r0   test_fixed_matches_threadz;TestFixedPatternDetectsRiskyUsage.test_fixed_matches_threadf   s    yyV(IVy(IJVRVVJRVVVVVJRVVVVVVVrVVVrVVVyVVVVVVVVVVVV(IVVVJVVVRVVVVVVVVVr2   c           	         t         j                  }d} |t        |      }d}||u}|s&t        j                  d|fd||f      dt        j                         v st        j                  t               rt        j                  t               ndt        j                  |      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}x}}y)
u#   threading.Timer(1, fn)는 탐지함zt = threading.Timer(1, fn)Nr   r   r   rD   r   r4   r   rE   r'   s           r0   test_fixed_matches_timerz:TestFixedPatternDetectsRiskyUsage.test_fixed_matches_timerj       yyQ(DQy(DEQTQETQQQQETQQQQQQrQQQrQQQyQQQQQQQQQQQQ(DQQQEQQQTQQQQQQQQr2   c           	         t         j                  }d} |t        |      }d}||u}|s&t        j                  d|fd||f      dt        j                         v st        j                  t               rt        j                  t               ndt        j                  |      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}x}}y)
u   threading.local()은 탐지함ztls = threading.local()Nr   r   r   rD   r   r4   r   rE   r'   s           r0   test_fixed_matches_localz:TestFixedPatternDetectsRiskyUsage.test_fixed_matches_localn   s    yyN(ANy(ABN$NB$NNNNB$NNNNNNrNNNrNNNyNNNNNNNNNNNN(ANNNBNNN$NNNNNNNNr2   c           	         t         j                  }d} |t        |      }d}||u}|s&t        j                  d|fd||f      dt        j                         v st        j                  t               rt        j                  t               ndt        j                  |      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}x}}y)
u'   threading.current_thread()는 탐지함zthreading.current_thread()Nr   r   r   rD   r   r4   r   rE   r'   s           r0   !test_fixed_matches_current_threadzCTestFixedPatternDetectsRiskyUsage.test_fixed_matches_current_threadr   rX   r2   N)r9   r:   r;   r<   rU   rW   rZ   r\   r=   r2   r0   rS   rS   c   s    GWRORr2   rS   c                   .    e Zd ZdZdefdZd Zd Zd Zy)TestSourceContainsFixedPatternuH   two_pass_audit.py 소스 파일에 수정된 패턴이 있음을 확인.returnc                    t        t              j                  j                  dz  }|j                  } |       }|st	        j
                  d|       dz   dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      t	        j                  |      dz  }t        t	        j                  |            d x}}|j                  d      S )Nr   u   소스 파일이 없음: zC
>assert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}source_path)r   r	   py4zutf-8)encoding)r   __file__parentexistsr   r$   r    r!   r"   r#   r%   r&   	read_text)r(   ra   r)   @py_assert3@py_format5s        r0   _load_sourcez+TestSourceContainsFixedPattern._load_source   s    8n++225HH!!N!#N#NN'@%NNNNNNN{NNN{NNN!NNN#NNNNNN$$g$66r2   c                    | j                         }d}||v }|st        j                  d|fd||f      t        j                  |      dt	        j
                         v st        j                  |      rt        j                  |      nddz  }t        j                  d      dz   d|iz  }t        t        j                  |            d	x}}y	)
u1   소스에 수정된 lookahead 패턴이 포함됨zthreading\.(?!inz%(py1)s in %(py3)ssrcpy1r   u6   수정된 패턴 'threading\.(?!' 이 소스에 없음
>assert %(py5)sr
   N
rj   r   r   r#   r    r!   r"   r$   r%   r&   r(   ro   @py_assert0@py_assert2@py_format4@py_format6s         r0   test_fixed_pattern_in_sourcez;TestSourceContainsFixedPattern.test_fixed_pattern_in_source   sx    ! b C'bbb Cbbb bbbbbbCbbbCbbbb)bbbbbbbr2   c                    | j                         }d}||v}|st        j                  d|fd||f      t        j                  |      dt	        j
                         v st        j                  |      rt        j                  |      nddz  }t        j                  d      dz   d|iz  }t        t        j                  |            d	x}}y	)
u(   소스에 버그 있는 패턴이 없음zthreading\.\w+(?!)not in)z%(py1)s not in %(py3)sro   rp   uD   버그 패턴 'threading\.\w+(?!' 이 소스에 아직 남아 있음rr   r
   Nrs   rt   s         r0    test_buggy_pattern_not_in_sourcez?TestSourceContainsFixedPattern.test_buggy_pattern_not_in_source   sx    !#x#3.xxx#3xxx#xxxxxx3xxx3xxxx0xxxxxxxr2   c                    | j                         }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}}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)
u2   Condition과 Barrier가 제외 목록에 포함됨	Conditionrl   rn   ro   rp   zassert %(py5)sr
   NBarrier)	rj   r   r   r#   r    r!   r"   r%   r&   rt   s         r0   ,test_condition_and_barrier_in_exclusion_listzKTestSourceContainsFixedPattern.test_condition_and_barrier_in_exclusion_list   s    !!{c!!!!{c!!!{!!!!!!c!!!c!!!!!!!yCyCyCCr2   N)	r9   r:   r;   r<   strrj   ry   r|   r   r=   r2   r0   r^   r^   |   s"    R7c 7
cy
 r2   r^   )3r<   builtinsr    _pytest.assertion.rewrite	assertionrewriter   importlib.util	importlibr   syspathlibr   pytestrd   re   _TWO_PASS_PATHutilspec_from_file_locationr   r)   r*   rh   ru   loader@py_assert10@py_assert13@py_assert12r   r!   r"   r#   rx   @py_format8append@py_format15@py_format17_format_boolop@py_format18@py_format20r%   r&   module_from_spec_two_pass_moduleexec_moduler   rD   r   r?   rS   r^   r=   r2   r0   <module>r      s      	 
   h&&--0CC../FW 5D 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>>2259    ) * @ RP P.L LBR R2   r2   