o
    i|o                     @   s*  d dl Z d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dl	Z	d dl
mZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dl m!Z! d dl m"Z" d dl m#Z# d dl m$Z$ d dl m%Z% d dl m&Z& d dl m'Z' d dl m(Z( d dl m)Z) d dl m*Z* d dl m+Z+ d d l m,Z, d d!l m-Z- d d"l m.Z. d d#l/m0Z0 d d$l1m2Z2 d d%l1m3Z3 d d&l4m5Z5 d d'l6m7Z7 d d(l6m8Z8 d d)l9m:Z: d d*l;m<Z< d d+l=m>Z> e5e?Z@G d,d- d-ee eZAdS ).    N)Path)time_ns)ContextManager)Optional)Union)Context)BENCHMARK_INFO)	SpanTypes)test)ITR_SKIPPING_LEVEL)TestId)TestExcInfo)TestSourceFileInfo)
TestStatus)SPECIAL_STATUS)TestVisibilityChildItem)TestVisibilityItemBase)TestVisibilitySessionSettings)TestVisibilityCoverageData)	BENCHMARK)ITR_CORRELATION_ID_TAG_NAME)RETRY_REASON)TEST)TEST_ATTEMPT_TO_FIX_PASSED)TEST_EFD_ABORT_REASON)TEST_FINAL_STATUS)TEST_HAS_FAILED_ALL_RETRIES)TEST_IS_ATTEMPT_TO_FIX)TEST_IS_DISABLED)TEST_IS_NEW)TEST_IS_QUARANTINED)TEST_IS_RETRY)TEST_RETRY_REASON)EVENT_TYPES)record_event_created_test)record_event_finished_test)
get_logger)BENCHMARK_TAG_MAP)BenchmarkDurationData)EFDTestStatus)CoverageLines)asboolc                       s  e Zd ZeZejZ												ddedede	e de	e
e  de	e de	eeef  d	ed
edede	e dedededef fddZdde	e ddf fddZd fddZdefddZdeeef fddZdddZddd Zdd!d"Zdd#d$Zdd%d&Zdd'd(Zd)d* Zd+d, Z					dd-e	e d.e	e d/e	e d0e	e d1e	e ddf fd2d3Z					dd-e	e d.e	e d/e	e d0e	e d1e	e ddfd4d5Z dd6eddf fd7d8Z!de"ee#f f fd9d:Z$dd;d<Z%dd=d>Z&				dde	e d?e	e de	e de	e
e  ddf
d@dAZ'dBee(e)f ddfdCdDZ*deddfdEdFZ+dGdH Z,dIdJ Z-dKdL Z.dMdN Z/dOdP Z0dQeddf fdRdSZ1ddTdUZ2dVe3dd fdWdXZ4defdYdZZ5d[d\ Z6defd]d^Z7dde	e3 fd_d`Z8dVe3ddfdadbZ9		ddVe3d/ed0e	e d1e	e ddf
dcddZ:de;fdedfZ<dgeddfdhdiZ=dVe3dd fdjdkZ>dldm Z?defdndoZ@dpdq ZAdde	e3 fdrdsZBdVe3fdtduZC		ddVe3d/ed0e	e d1e	e fdvdwZDdefdxdyZEdVe3dd fdzd{ZFd|d} ZGdefd~dZHdd ZIdde	e3 fddZJdVe3fddZK		ddVe3d/ed0e	e d1e	e fddZLdefddZMdd ZNdd ZOdde	eP defddZQdefddZR  ZSS )TestVisibilityTestNFnamesession_settings
parameters
codeownerssource_file_infoinitial_tagsis_efd_retryis_atr_retryis_attempt_to_fix_retryresourceis_newis_quarantinedis_disabledis_attempt_to_fixc                    s   || _ t j|||j||
d ur|
n|d || _|| _d | _d | _t | _	| j d ur1| 
tj| || _|| _|| _|| _|j| _|| _g | _d | _|| _g | _|	| _g | _d| _d | _d | _d | _d S )N)r6   F)_parameterssuper__init__test_operation_name_codeowners_source_file_info_original_test	_exc_infor   _coverage_dataset_tagr
   
PARAMETERS_is_new_is_quarantined_is_disabled_is_attempt_to_fixknown_tests_enabled_is_known_tests_enabled_efd_is_retry_efd_retries_efd_abort_reason_atr_is_retry_atr_retries_attempt_to_fix_is_retry_attempt_to_fix_retries_is_benchmark_benchmark_duration_data_overwritten_suite_name_main_tracer_context)selfr-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   	__class__ \/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/internal/ci_visibility/api/_test.pyr=   7   s>   

zTestVisibilityTest.__init__contextreturnc                    sT   t  | ttdr&| jr(tjt	| jj
| jjd| _| j  d S d S d S )NDD_CIVISIBILITY_USE_BETA_WRITER)trace_idspan_id)r<   _start_spanr+   osgetenv_spanddtracetracer_activate_contextr   r_   r`   rV   	__enter__)rW   r\   rX   rZ   r[   ra   q   s   zTestVisibilityTest._start_spanc                    s:   t    ttdr| jr| jd d d  d S d S d S )Nr^   )r<   _finish_spanr+   rb   rc   rV   __exit__rW   rX   rZ   r[   ri   z   s   
zTestVisibilityTest._finish_spanc                 C   sX   | j d ur	| j jnd}| j d ur| j j d ur| j j jnd}d| jj| j||| j| jS )Nnonez:{}(name={}, suite={}, module={}, parameters={}, status={}))parentr-   formatrY   __name__r;   _status)rW   
suite_namemodule_namerZ   rZ   r[   __repr__   s
   $zTestVisibilityTest.__repr__c                 C   s   t j| jiS N)r
   NAMEr-   rk   rZ   rZ   r[   _get_hierarchy_tags   s   z&TestVisibilityTest._get_hierarchy_tagsc                 C   sH   | j r| tjt n| tjtj | jdur"| tj| j dS dS )z>Overrides parent tags for cases where they need to be modifiedN)	rS   rD   r
   TYPEr   r	   r   rU   SUITErk   rZ   rZ   r[   _set_item_tags   s   
z!TestVisibilityTest._set_item_tagsc                 C   s(   | j r|  r| t| j d S d S d S rt   )rK   r7   rD   r   rF   rk   rZ   rZ   r[   _set_known_tests_tags   s   z(TestVisibilityTest._set_known_tests_tagsc                 C   sD   | j r| t| j  | ttjj | jd ur | t| j d S d S rt   )	rL   rD   r!   r"   r   EARLY_FLAKE_DETECTIONvaluerN   r   rk   rZ   rZ   r[   _set_efd_tags   s   
z TestVisibilityTest._set_efd_tagsc                 C   s,   | j r| t| j  | ttjj d S d S rt   )rO   rD   r!   r"   r   AUTO_TEST_RETRIESr|   rk   rZ   rZ   r[   _set_atr_tags   s   z TestVisibilityTest._set_atr_tagsc                 C   sD   | j r
| t| j  | jr| t| j | jr | t| j d S d S rt   )rG   rD   r    rH   r   rI   r   rk   rZ   rZ   r[   _set_test_management_tags   s   z,TestVisibilityTest._set_test_management_tagsc                 C   s<   | j du rdS | jdur| j | jj| jj| jj dS dS )zThis handles setting tags that can't be properly stored in self._tags

        - exc_info: because it uses span.set_exc_info()
        N)rd   rB   set_exc_infoexc_type	exc_valueexc_tracebackrk   rZ   rZ   r[   _set_span_tags   s
   

 z!TestVisibilityTest._set_span_tagsc                 C   s   t | jj| jd d S )N)test_frameworkis_benchmark)r$   _session_settingstest_framework_metric_namerS   rk   rZ   rZ   r[   _telemetry_record_event_created   s   
z2TestVisibilityTest._telemetry_record_event_createdc                 C   sZ   t | jj| j|  | jp| j| j|  | 	 | 
 |  |  |  | jj| jjd d S )N)r   r   r7   is_retry"early_flake_detection_abort_reasonr8   r9   r:   has_failed_all_retriesis_rumbrowser_driverci_provider_nameis_auto_injected)r%   r   r   rS   r7   rL   rO   rN   r8   r9   r:   r   _is_rum_get_browser_driverr   r   rk   rZ   rZ   r[    _telemetry_record_event_finished   s   

z3TestVisibilityTest._telemetry_record_event_finishedoverride_statusoverride_finish_timestatusskip_reasonexc_infoc                    s   t d| || | tjtj |d ur|n|}|d ur!| | |d ur,| tj| |d ur3|| _	| j
jjrF|  rF| jsF|  rFd| _t j||d d S )Nz?Test Visibility: finishing %s, with status: %s, skip_reason: %sslow)r   r   )logdebugrD   r
   rw   r	   r   
set_statusSKIP_REASONrB   r   efd_settingsenabledr7   rL   _efd_should_abortrN   r<   prepare_for_finish)rW   r   r   r   r   r   rp   rX   rZ   r[   r      s&   
z%TestVisibilityTest.prepare_for_finishc                 C   s   | j |||||d dS )z>Backward compatibility method that calls prepare_for_finish().)r   r   r   r   r   N)r   )rW   r   r   r   r   r   rZ   rZ   r[   finish_test   s   	
zTestVisibilityTest.finish_testforcec                    s   t  j|d dS )zSend the test span to the backend.

        This should be called after prepare_for_finish() has been called to prepare the span.
        If prepare_for_finish() hasn't been called yet, it will be called automatically for backward compatibility.
        )r   N)r<   finish)rW   r   rX   rZ   r[   r     s   zTestVisibilityTest.finishc                    sf   |   r|  }|tjtjfv rtjS |tjkrtjS tj	S | 
 r&|  S |  r.|  S t  S rt   )efd_has_retriesefd_get_final_statusr)   ALL_PASSFLAKYr   PASSALL_SKIPSKIPFAILatr_has_retriesatr_get_final_statusattempt_to_fix_has_retriesattempt_to_fix_get_final_statusr<   
get_status)rW   
efd_statusrX   rZ   r[   r     s   

zTestVisibilityTest.get_statusc                 C   s   | j dur| j   dS dS )zTests do not count skipping on themselves, so only count on the parent.

        When skipping at the suite level, the counting only happens when suites are finished as ITR-skipped.
        N)rm   count_itr_skippedrk   rZ   rZ   r[   r     s   
z$TestVisibilityTest.count_itr_skippedc                 C   sP   t d|  | jjtjkr|   |   | jt	j
d | t	j
 |   d S )Nz2Finishing Test Visibility test %s with ITR skipped)r   )r   r   r   itr_test_skipping_levelr   r   r   mark_itr_skippedr   r   r   set_final_statusr   rk   rZ   rZ   r[   finish_itr_skipped#  s   z%TestVisibilityTest.finish_itr_skippedrq   c                 C   sD   |d ur|| _ |d ur|| _|d ur| | |d ur || _d S d S rt   )r-   rU   set_parametersr?   )rW   r-   rq   r/   r0   rZ   rZ   r[   overwrite_attributes,  s   

z'TestVisibilityTest.overwrite_attributescoverage_datac                 C   s   | j | d S rt   )rC   add_covered_files)rW   r   rZ   rZ   r[   add_coverage_data<  s   z$TestVisibilityTest.add_coverage_datac                 C   s   || _ | tj| j  d S rt   )r;   rD   r
   rE   )rW   r/   rZ   rZ   r[   r   ?  s   z!TestVisibilityTest.set_parametersc                 C   s   | j o| jd u S rt   )rF   r;   rk   rZ   rZ   r[   r7   C  s   zTestVisibilityTest.is_newc                 C      | j jjo| jp| tS rt   )r   test_management_settingsr   rG   get_tagr    rk   rZ   rZ   r[   r8   H     
z!TestVisibilityTest.is_quarantinedc                 C   r   rt   )r   r   r   rH   r   r   rk   rZ   rZ   r[   r9   M  r   zTestVisibilityTest.is_disabledc                 C   r   rt   )r   r   r   rI   r   r   rk   rZ   rZ   r[   r:   R  r   z$TestVisibilityTest.is_attempt_to_fixc                 C   s   t | tS rt   )boolr   r   rk   rZ   rZ   r[   r   W     z)TestVisibilityTest.has_failed_all_retriesitr_enabledc                    sF   t  | |r| jjr| jjtjkr!| t| jj dS dS dS dS )zSet test-level ITR tagsN)	r<   _set_itr_tagsr   itr_correlation_idr   r   r   rD   r   )rW   r   rX   rZ   r[   r   Z  s   z TestVisibilityTest._set_itr_tagsc              	   C   sB   | j d ur	td| j| j| j| j| j| jd| jd}| j	|_	|S )Nz>Cannot create an early flake retry from a test with parametersT)r0   r1   r2   r3   r7   )
r;   
ValueErrorrY   r-   r   r?   r@   _tagsrF   rm   rW   
retry_testrZ   rZ   r[    make_early_flake_retry_from_testi  s   
	z3TestVisibilityTest.make_early_flake_retry_from_testretry_numberc                 C      | j |d  S N   )rM   rW   r   rZ   rZ   r[   _efd_get_retry_testy  r   z&TestVisibilityTest._efd_get_retry_testc                 C   s8   | j d u s| j jd u rtdt | j j d }|dkS )NzTest span has not started    eA,  )rd   start_nsr   r   )rW   
duration_srZ   rZ   r[   r   |  s   z$TestVisibilityTest._efd_should_abortc                 C   s   | j j}|js	dS |   rdS | jd urdS |  sdS |  s)t	d dS | j
jr6| j| j
jd  nd}t| j}|dkrF||jk S |dkrO||jk S |dkrX||jk S |dkra||jk S dS )	NFzGEarly Flake Detection: efd_should_retry called but test is not finishedr   r      
      r   )r   r   r   get_sessionefd_is_faulty_sessionrN   r7   is_prepared_for_finishr   r   rd   r   _finish_timelenrM   slow_test_retries_5sslow_test_retries_10sslow_test_retries_30sslow_test_retries_5m)rW   r   r   num_retriesrZ   rZ   r[   efd_should_retry  s.   






z#TestVisibilityTest.efd_should_retryc                 C      t | jdkS Nr   )r   rM   rk   rZ   rZ   r[   r     r   z"TestVisibilityTest.efd_has_retriesc                 C   sH   |   std d S t| jd }|  }| j| |r"|  |S )NzEEarly Flake Detection: efd_add_retry called but test should not retryr   )r   r   r   r   rM   r   appendstart)rW   start_immediatelyr   r   rZ   rZ   r[   efd_add_retry  s   
z TestVisibilityTest.efd_add_retryc                 C      |  |  d S rt   )r   r   r   rZ   rZ   r[   efd_start_retry     z"TestVisibilityTest.efd_start_retryc                 C   s`   |  |}|d ur|| |j|||d |  }|s*|  }t|tr*|| |  d S )Nr   r   r   )	r   r   r   r   r   
isinstancer   r   r   rW   r   r   r   r   r   will_retry_againfinal_statusrZ   rZ   r[   efd_finish_retry  s   



z#TestVisibilityTest.efd_finish_retryc                 C   s   t jdt jdt jdi}|| j  d7  < | jD ]}||j  d7  < qt| jd }|t j |kr4tjS |t j |kr>tj	S |t j |krHtj
S tjS )Nr   r   )r   r   r   r   rp   rM   r   r)   r   ALL_FAILr   r   )rW   status_countsretryexpected_totalrZ   rZ   r[   r     s   
z'TestVisibilityTest.efd_get_final_statusreasonc                 C   s
   || _ d S rt   )rN   )rW   r   rZ   rZ   r[   set_efd_abort_reason  s   
z'TestVisibilityTest.set_efd_abort_reasonc                 C   r   r   )rP   r   rZ   rZ   r[   _atr_get_retry_test  r   z&TestVisibilityTest._atr_get_retry_testc              	   C   2   | j | j| j| j| j| j|  dd}| j|_|S )NT)r0   r1   r2   r8   r4   rY   r-   r   r?   r@   r   r8   rm   r   rZ   rZ   r[   _atr_make_retry_test     	z'TestVisibilityTest._atr_make_retry_testc                 C   r   r   )r   rP   rk   rZ   rZ   r[   r     r   z"TestVisibilityTest.atr_has_retriesc                 C   s\   | j jjsdS |   rdS | jd u rtd dS |  t	j
kr$dS t| j| j jjk S )NFzCAuto Test Retries: atr_should_retry called but test is not finished)r   atr_settingsr   r   atr_max_retries_reachedr   r   r   r   r   r   r   rP   max_retriesrk   rZ   rZ   r[   atr_should_retry  s   


z#TestVisibilityTest.atr_should_retryc                 C   sX   |   std d S |  }| j| |  }|d ur!|  |r'|  t	| jS )NzAAuto Test Retries: atr_add_retry called but test should not retry)
r  r   r   r   rP   r   r   _atr_count_retryr   r   )rW   r   r   sessionrZ   rZ   r[   atr_add_retry  s   

z TestVisibilityTest.atr_add_retryc                 C   r   rt   )r   r   r   rZ   rZ   r[   atr_start_retry&  r   z"TestVisibilityTest.atr_start_retryc                 C   s~   |  |}|| jjjkr"|d ur|| |  tjkr"|t	d |j
|||d |  }|s9|  }|| |  d S )NTr   )r   r   r   r   r   r   r   r   rD   r   r   r  r   r   r   rZ   rZ   r[   atr_finish_retry)  s   


z#TestVisibilityTest.atr_finish_retryc                 C   s8   | j tjtjfv r| j S tdd | jD rtjS tjS )Nc                 s       | ]	}|j tjkV  qd S rt   rp   r   r   .0r   rZ   rZ   r[   	<genexpr>I      z:TestVisibilityTest.atr_get_final_status.<locals>.<genexpr>)rp   r   r   r   anyrP   r   rk   rZ   rZ   r[   r   E  s
   z'TestVisibilityTest.atr_get_final_statusc                 C   r   r   )rR   r   rZ   rZ   r[   _attempt_to_fix_get_retry_testQ  r   z1TestVisibilityTest._attempt_to_fix_get_retry_testc              	   C   r   )NT)r0   r1   r2   r8   r5   r   r   rZ   rZ   r[   _attempt_to_fix_make_retry_testT  r   z2TestVisibilityTest._attempt_to_fix_make_retry_testc                 C   r   r   )r   rR   rk   rZ   rZ   r[   r   b  r   z-TestVisibilityTest.attempt_to_fix_has_retriesc                 C   s8   | j jjsdS |  std dS t| j| j jjk S )NFzKAttempt To Fix: attempt_to_fix_should_retry called but test is not finished)	r   r   r   r   r   r   r   rR   attempt_to_fix_retriesrk   rZ   rZ   r[   attempt_to_fix_should_retrye  s   

z.TestVisibilityTest.attempt_to_fix_should_retryc                 C   s@   |   std d S |  }| j| |r|  t| jS )NzIAttempt To Fix: attempt_to_fix_add_retry called but test should not retry)r  r   r   r  rR   r   r   r   )rW   r   r   rZ   rZ   r[   attempt_to_fix_add_retryr  s   

z+TestVisibilityTest.attempt_to_fix_add_retryc                 C   r   rt   )r  r   r   rZ   rZ   r[   attempt_to_fix_start_retry  r   z-TestVisibilityTest.attempt_to_fix_start_retryc           
      C   s   |  |}|| jjjkr7|d ur|| tdd | jD }tdd | jD }|r1|td |t	| |j
|||d |  }|sN|  }	||	 |  d S )Nc                 s   r  rt   r  r	  rZ   rZ   r[   r    r  zATestVisibilityTest.attempt_to_fix_finish_retry.<locals>.<genexpr>c                 s   r  rt   )rp   r   r   r	  rZ   rZ   r[   r    r  Tr   )r  r   r   r  r   allrR   rD   r   r   r   r  r   r   r   )
rW   r   r   r   r   r   
all_passed
all_failedr   r   rZ   rZ   r[   attempt_to_fix_finish_retry  s   


z.TestVisibilityTest.attempt_to_fix_finish_retryc                 C   s:   t dd | jD rtjS t dd | jD rtjS tjS )Nc                 s   r  rt   r  r	  rZ   rZ   r[   r    r  zETestVisibilityTest.attempt_to_fix_get_final_status.<locals>.<genexpr>c                 s   r  rt   )rp   r   r   r	  rZ   rZ   r[   r    r  )r  rR   r   r   r   r   rk   rZ   rZ   r[   r     s
   z2TestVisibilityTest.attempt_to_fix_get_final_statusc                 C   s   | j d u rdS | j ddkS )NFztest.is_rum_activetruerd   r   rk   rZ   rZ   r[   r     s   
zTestVisibilityTest._is_rumc                 C   s   | j d u rd S | j dS )Nztest.browser.driverr  rk   rZ   rZ   r[   r     s   
z&TestVisibilityTest._get_browser_driverTduration_datar   c                 C   s\   || _ || _| j d ur*| td t D ]\}}t| j |}|d ur)| || qd S d S )NTime)rT   rS   rD   r   r'   itemsgetattr)rW   r  r   tagattrr|   rZ   rZ   r[   set_benchmark_data  s   
z%TestVisibilityTest.set_benchmark_datar   c                 C   s   |  t|j dS )aD  Set the final_status tag on the test span.

        If this test has retries, the tag is set on the last retry span.
        Otherwise, it's set on this test's span.

        With the new two-phase approach (prepare_for_finish + finish), this should be called
        AFTER prepare_for_finish() but BEFORE finish().
        N)_add_tag_to_spanr   r|   )rW   r   rZ   rZ   r[   r     s   	z#TestVisibilityTest.set_final_status)NNNNFFFNFFFFrt   )r]   N)NNNNN)F)NNNN)r]   r,   )NN)T)Tro   
__module____qualname__r   _event_typer#   _event_type_metric_namestrr   r   listr   dictr   r=   r   ra   ri   rs   rv   ry   rz   r}   r   r   r   r   r   r   floatr   r   r   r   r   r   r   r   r   r   r   r*   r   r   r7   r8   r9   r:   r   r   r   intr   r   r   r   r   r   r   r)   r   r   r   r   r   r  r  r  r  r   r  r  r   r  r  r  r  r   r   r   r(   r   r   __classcell__rZ   rZ   rX   r[   r,   3   sj   
	
:	







"
	




#


$r,   )Brb   pathlibr   timer   typingr   r   r   re   ddtrace._trace.contextr   3ddtrace.contrib.internal.pytest_benchmark.constantsr   ddtrace.extr	   r
   ddtrace.ext.test_visibilityr   1ddtrace.ext.test_visibility._test_visibility_baser   "ddtrace.ext.test_visibility.statusr   r   r   (ddtrace.internal.ci_visibility.api._baser   r   r   r   1ddtrace.internal.ci_visibility.api._coverage_datar   (ddtrace.internal.ci_visibility.constantsr   r   r   r   r   r   r   r   r   r   r   r    r!   r"   2ddtrace.internal.ci_visibility.telemetry.constantsr#   /ddtrace.internal.ci_visibility.telemetry.eventsr$   r%   ddtrace.internal.loggerr&   1ddtrace.internal.test_visibility._benchmark_mixinr'   r(   ,ddtrace.internal.test_visibility._efd_mixinsr)   /ddtrace.internal.test_visibility.coverage_linesr*   ddtrace.internal.utils.formatsr+   ro   r   r,   rZ   rZ   rZ   r[   <module>   s\    