o
    i9                     @  s  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	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 eddG dd dZeddG dd dZeddG dd dZG dd deZG dd dZejdddZ ejdddZ!G dd  d ej"e e!f Z#G d!d" d"e#d#ej$f Z%G d$d# d#e#d% Z&G d&d' d'e#d( Z'G d)d* d*e#d+ Z(G d,d- d-e#ej$d*f Z)G d.d/ d/Z*dS )0    )annotations)defaultdict)	dataclass)EnumN)Path)DEFAULT_SERVICE_NAME)TAG_TRUE)ITRSkippingLevel)	EventType)TelemetryAPI)Time)TestContext)_gen_item_idT)frozenc                   @  s   e Zd ZU ded< dS )	ModuleRefstrnameN__name__
__module____qualname____annotations__ r   r   V/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/testing/internal/test_data.pyr      s   
 r   c                   @  s   e Zd ZU ded< ded< dS )SuiteRefr   moduler   r   Nr   r   r   r   r   r      s   
 r   c                   @  s"   e Zd ZU ded< ded< dZdS )TestRefr   suiter   r   FN)r   r   r   r   __test__r   r   r   r   r       s   
 r   c                   @  s   e Zd ZdZdZdZdZdS )
TestStatuspassfailskipFN)r   r   r   PASSFAILSKIPr   r   r   r   r   r   '   s
    r   c                   @  s   e Zd ZdZdZdS )TestTypetest	benchmarkN)r   r   r   TEST	BENCHMARKr   r   r   r   r&   .   s    r&   TParentClasszTestItem[t.Any, t.Any])boundTChildClassc                   @  s   e Zd ZU dZded< d5dd	Zd6ddZd7d8ddZd9ddZd9ddZ	d:ddZ
d:ddZd;ddZd<d!d"Zd=d$d%Zd;d&d'Zd9d(d)Zd>d+d,Zd?d/d0Zd@d3d4ZdS )ATestItemFztype[TChildClass]
ChildClassr   r   parentr+   c                 C  sB   || _ i | _d | _d | _|| _t | _d | _i | _i | _	t
| _d S N)r   childrenstart_nsduration_nsr0   r   item_idstatustagsmetricsr   serviceselfr   r0   r   r   r   __init__;   s   
zTestItem.__init__returnfloatc                 C  s8   | j d u r	td| jd ur| jnt | j  }|d S )Nz$seconds_so_far() called before startg    eA)r3   
ValueErrorr4   r   time_ns)r;   r4   r   r   r   seconds_so_farG   s   
zTestItem.seconds_so_farNr3   t.Optional[int]Nonec                 C  s    |d ur	|| _d S t  | _d S r1   )r   r@   r3   )r;   r3   r   r   r   startM       zTestItem.startc                 C  s   | j d u r|   d S d S r1   )r3   rD   r;   r   r   r   ensure_startedP   s   
zTestItem.ensure_startedc                 C  s.   | j d u r	td|   t | j  | _d S )Nzfinish() called before start)r3   r?   set_final_tagsr   r@   r4   rF   r   r   r   finishT   s   
zTestItem.finishboolc                 C  
   | j d uS r1   )r3   rF   r   r   r   
is_started[      
zTestItem.is_startedc                 C  rK   r1   )r4   rF   r   r   r   is_finished^   rM   zTestItem.is_finishedr   c                 C  s   | j d u r
|  | _ | j S r1   )r6   _get_status_from_childrenrF   r   r   r   
get_statusa   s   

zTestItem.get_statusr6   c                 C  
   || _ d S r1   )r6   )r;   r6   r   r   r   
set_statusf   rM   zTestItem.set_statusr9   c                 C  rQ   r1   )r9   )r;   r9   r   r   r   set_servicei   rM   zTestItem.set_servicec                 C  sr   t dd }d}| j D ]}| }|r!||  d7  < |d7 }q|tj dkr,tjS |tj |kr6tjS tjS )Nc                   S  s   dS Nr   r   r   r   r   r   <lambda>m   s    z4TestItem._get_status_from_children.<locals>.<lambda>r      )r   r2   valuesrP   r   r$   r%   r#   )r;   status_countstotal_countchildr6   r   r   r   rO   l   s   z"TestItem._get_status_from_childrenc                 C  s   d S r1   r   rF   r   r   r   rH   ~   s   zTestItem.set_final_tagstuple[TChildClass, bool]c                 C  sD   d}|| j vrd}| j|| d}|| j || j |< | j | |fS )NFTr   r0   )r2   r/   rS   r9   )r;   r   createdrZ   r   r   r   get_or_create_child   s   

zTestItem.get_or_create_childr7   dict[str, str]c                 C     | j | d S r1   )r7   update)r;   r7   r   r   r   set_tags      zTestItem.set_tagsr8   dict[str, float]c                 C  r`   r1   )r8   ra   )r;   r8   r   r   r   set_metrics   rc   zTestItem.set_metrics)r   r   r0   r+   )r=   r>   r1   )r3   rB   r=   rC   r=   rC   r=   rJ   )r=   r   )r6   r   r=   rC   )r9   r   r=   rC   )r   r   r=   r[   )r7   r_   r=   rC   )r8   rd   r=   rC   )r   r   r   r   r   r<   rA   rD   rG   rI   rL   rN   rP   rR   rS   rO   rH   r^   rb   re   r   r   r   r   r.   7   s$   
 












r.   c                      s|   e Zd ZdZd" fdd	Zd#d
dZd$ddZd%ddZd%ddZd&ddZ	d%ddZ
d%ddZd'ddZd(d d!Z  ZS ))TestRunFr   r   r0   Testr=   rC   c                   sV   t  j||d d | _d | _d| _|| _|j| _| jj| _| jj| _	t
j| jtj< d S )Nr\   r   )superr<   span_idtrace_idattempt_numberr'   r0   r   r   sessionr&   r)   r7   TestTag	TEST_TYPEr:   	__class__r   r   r<      s   

zTestRun.__init__c                 C  s   | j  d| j S )Nz #)r'   rm   rF   r   r   r   __str__      zTestRun.__str__contextr   c                 C  s0   |j | _ |j| _| |  | |  d S r1   )rk   rl   rb   get_tagsre   get_metrics)r;   ru   r   r   r   set_context   s   zTestRun.set_contextrJ   c                 C  s
   | j dkS rT   )rm   rF   r   r   r   is_retry   rM   zTestRun.is_retryc                 C     | j tjtkS r1   )r7   getro   HAS_FAILED_ALL_RETRIESr   rF   r   r   r   has_failed_all_retries   rt   zTestRun.has_failed_all_retriesc                 C  s   t j| jtj< d S r1   )r&   r*   r7   ro   rp   rF   r   r   r   mark_benchmark   rt   zTestRun.mark_benchmarkc                 C  s   | j tjtjkS r1   )r7   r{   ro   rp   r&   r*   rF   r   r   r   is_benchmark      zTestRun.is_benchmarkc                 C  rz   r1   )r7   r{   ro   IS_RUM_ACTIVEr   rF   r   r   r   is_rum   rt   zTestRun.is_rumt.Optional[str]c                 C     | j tjS r1   )r7   r{   ro   BROWSER_DRIVERrF   r   r   r   get_browser_driver      zTestRun.get_browser_driverfinal_statusr   c                 C  s   |j | jtj< dS )a  Set the final status tag on the test run.

        This tag indicates the ultimate outcome of the test, especially useful
        when retries are involved. For single test runs, it matches test.status.
        For retry scenarios, only the last retry gets this tag.
        N)valuer7   ro   FINAL_STATUS)r;   r   r   r   r   set_final_status   s   zTestRun.set_final_status)r   r   r0   ri   r=   rC   r=   r   )ru   r   r=   rC   rg   rf   r=   r   )r   r   r=   rC   )r   r   r   r   r<   rs   rx   ry   r}   r~   r   r   r   r   __classcell__r   r   rq   r   rh      s    







rh   ri   c                      s  e Zd ZdZeZdG fdd	ZdHd
dZ				dIdJddZdKddZ	dLddZ
dMddZdNd!d"ZdOd#d$ZdOd%d&ZdOd'd(ZdOd)d*ZdOd+d,ZdPd.d/ZedPd0d1ZdQd2d3ZdOd4d5ZdQd6d7ZdOd8d9ZdQd:d;ZdOd<d=ZdRd?d@ZdLdAdBZdQdCdDZdOdEdFZ  ZS )Sri   Fr   r   r0   	TestSuiter=   rC   c                   s:   t  j||d g | _|| _| jj| _| jj| _d| _d S )Nr\   F)rj   r<   	test_runsr   r0   r   rn   _is_flaky_runr:   rq   r   r   r<      s   


zTest.__init__c                 C  s    | j j j d| j j d| j S )N/z::r0   r   rF   r   r   r   rs      rE   zTest.__str__is_newrJ   is_quarantinedis_disabledis_attempt_to_fixc                 C  sH   |rt | jtj< |rt | jtj< |rt | jtj< |r"t | jtj< d S d S r1   )r   r7   ro   IS_NEWIS_QUARANTINEDIS_DISABLEDIS_ATTEMPT_TO_FIX)r;   r   r   r   r   r   r   r   set_attributes   s   zTest.set_attributespath t.Union[os.PathLike[t.Any], str]
start_lineintc                 C  s,   t || jtj< |rt || jtj< d S d S r1   )r   r7   ro   SOURCE_FILESOURCE_START)r;   r   r   r   r   r   set_location   s   zTest.set_locationr   c                 C  r   r1   )r7   r{   ro   r   rF   r   r   r   get_source_file   r   zTest.get_source_file
parametersc                 C     || j tj< d S r1   )r7   ro   
PARAMETERS)r;   r   r   r   r   set_parameters   rc   zTest.set_parametersowners	list[str]c                 C  s   t || jtj< d S r1   )jsondumpsr7   ro   
CODEOWNERS)r;   r   r   r   r   set_codeowners   s   zTest.set_codeownersc                 C  rz   r1   )r7   r{   ro   r   r   rF   r   r   r   r      rt   zTest.is_newc                 C  rz   r1   )r7   r{   ro   r   r   rF   r   r   r   r      rt   zTest.is_quarantinedc                 C  rz   r1   )r7   r{   ro   r   r   rF   r   r   r   r     rt   zTest.is_disabledc                 C  rz   r1   )r7   r{   ro   r   r   rF   r   r   r   r     rt   zTest.is_attempt_to_fixc                 C  s   t j| jv S r1   )ro   r   r7   rF   r   r   r   has_parameters	  s   zTest.has_parametersrh   c                 C  s6   t | j| d}t| j|_|| j | j| |S Nr\   )rh   r   lenr   rm   rS   r9   append)r;   test_runr   r   r   make_test_run  s
   zTest.make_test_runc                 C  s
   | j d S )N)r   rF   r   r   r   last_test_run  s   
zTest.last_test_runc                 C  8   t | jtj< zt tj W d S  t	y   Y d S w r1   )
r   r7   ro   ITR_UNSKIPPABLEr   r{   record_itr_unskippabler
   r)   RuntimeErrorrF   r   r   r   mark_unskippable     zTest.mark_unskippablec                 C  rz   r1   )r7   r{   ro   r   r   rF   r   r   r   is_unskippable   rt   zTest.is_unskippablec                 C  r   r1   )
r   r7   ro   ITR_FORCED_RUNr   r{   record_itr_forced_runr
   r)   r   rF   r   r   r   mark_forced_run#  r   zTest.mark_forced_runc                 C  rz   r1   )r7   r{   ro   r   r   rF   r   r   r   is_forced_run*  rt   zTest.is_forced_runc                 C  sH   t | jtj< | j jd7  _zt t	j
 W d S  ty#   Y d S w )NrV   )r   r7   ro   SKIPPED_BY_ITRrn   tests_skipped_by_itrr   r{   record_itr_skippedr
   r)   r   rF   r   r   r   mark_skipped_by_itr-  s   zTest.mark_skipped_by_itrc                 C  rz   r1   )r7   r{   ro   r   r   rF   r   r   r   is_skipped_by_itr5  rt   zTest.is_skipped_by_itrreasonc                 C  r   r1   r7   ro   EFD_ABORT_REASONr;   r   r   r   r   &set_early_flake_detection_abort_reason:  rc   z+Test.set_early_flake_detection_abort_reasonc                 C  r   r1   r7   r{   ro   r   rF   r   r   r   &get_early_flake_detection_abort_reason=  r   z+Test.get_early_flake_detection_abort_reasonc                 C  s
   d| _ d S )NTr   rF   r   r   r   mark_flaky_run@  rM   zTest.mark_flaky_runc                 C  s   | j S r1   r   rF   r   r   r   is_flaky_runC  s   zTest.is_flaky_run)r   r   r0   r   r=   rC   r   )FFFF)
r   rJ   r   rJ   r   rJ   r   rJ   r=   rC   )r   r   r   r   r=   rC   r   )r   r   r=   rC   )r   r   r=   rC   rg   )r=   rh   rf   r   r   r=   rC   ) r   r   r   r   rh   r/   r<   rs   r   r   r   r   r   r   r   r   r   r   r   propertyr   r   r   r   r   r   r   r   r   r   r   r   r   r   rq   r   ri      s@    



















)r   rh   c                      s0   e Zd ZeZdZd fdd	Zdd
dZ  ZS )r   Fr   r   r0   
TestModuler=   rC   c                   s$   t  j||d || _| jj| _d S r   )rj   r<   r   r0   rn   r:   rq   r   r   r<   K  s   zTestSuite.__init__c                 C  s   | j j d| j S )Nr   r   rF   r   r   r   rs   P  r   zTestSuite.__str__)r   r   r0   r   r=   rC   r   )	r   r   r   ri   r/   r   r<   rs   r   r   r   rq   r   r   G  s
    r   )r   ri   c                      s:   e Zd ZeZdZd fdd	Zdd
dZdddZ  Z	S )r   Fr   r   r0   TestSessionr=   rC   c                   s   t  j||d || _d S r   )rj   r<   rn   r:   rq   r   r   r<   X  s   
zTestModule.__init__c                 C  s   | j  S r1   )r   rF   r   r   r   rs   \  s   zTestModule.__str__module_pathr   c                 C  s   t || _d S r1   )r   r   )r;   r   r   r   r   r   _  r   zTestModule.set_location)r   r   r0   r   r=   rC   r   )r   r   r=   rC   )
r   r   r   r   r/   r   r<   rs   r   r   r   r   rq   r   r   T  s    
r   )r   r   c                      sf   e Zd ZeZdZd  fddZd!d
dZd"ddZd#ddZ	d$ddZ
d%ddZd& fddZ  ZS )'r   Fr   r   c                   s.   t  j|d d d| _d| _d| _tj| _d S )Nr\   r   F)rj   r<   r   itr_enableditr_skipping_enabledr	   r)   itr_skipping_level)r;   r   rq   r   r   r<   g  s
   zTestSession.__init__
session_idr   r=   rC   c                 C  rQ   r1   )r5   )r;   r   r   r   r   set_session_idn  rM   zTestSession.set_session_idtest_commandtest_frameworktest_framework_versionc                 C     || _ || _|| _d S r1   )r   r   r   )r;   r   r   r   r   r   r   r   q     
zTestSession.set_attributesr   rJ   skipping_enabledskipping_levelr	   c                 C  r   r1   )r   r   r   )r;   r   r   r   r   r   r   set_itr_attributesv  r   zTestSession.set_itr_attributesr   c                 C  r   r1   r   r   r   r   r   r   {  rc   z2TestSession.set_early_flake_detection_abort_reasonr   c                 C  r   r1   r   rF   r   r   r   r   ~  r   z2TestSession.get_early_flake_detection_abort_reasonc                   s~   t    | jr
tnd| jtj< | jr=| jdk}|rtnd| jtj	< |r&tnd| jtj
< | jj| jtj< | j| jtj< d S d S )Nfalser   )rj   rH   r   r   r7   ro   ITR_TESTS_SKIPPING_ENABLEDr   r   ITR_TESTS_SKIPPEDITR_DD_CI_ITR_TESTS_SKIPPEDr   r   ITR_TESTS_SKIPPING_TYPEr8   ITR_TESTS_SKIPPING_COUNT)r;   has_itr_skipsrq   r   r   rH     s   

zTestSession.set_final_tags)r   r   )r   r   r=   rC   )r   r   r   r   r   r   r=   rC   )r   rJ   r   rJ   r   r	   r=   rC   r   r   rf   )r   r   r   r   r/   r   r<   r   r   r   r   r   rH   r   r   r   rq   r   r   c  s    




r   c                   @  s   e 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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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&Z(d'Z)d(Z*d)Z+d*Z,d+Z-d,S )-ro   	componentztest.commandztest.frameworkztest.framework_versionztest_session.namez	test.namez
test.suiteenvzerror.stackz
error.typezerror.messageztest.skip_reasonz	test.typeztest.is_newz#test.test_management.is_quarantinedz%test.test_management.is_test_disabledz&test.test_management.is_attempt_to_fixz*test.test_management.attempt_to_fix_passedztest.early_flake.abort_reasonztest.is_retryztest.retry_reasonztest.has_failed_all_retriesztest.final_statuszpytest.xfail.reasonztest.resultztest.parametersztest.itr.unskippableztest.itr.forced_runztest.skipped_by_itrztest.itr.tests_skipping.enabledz%test.itr.tests_skipping.tests_skippedz_dd.ci.itr.tests_skippedztest.itr.tests_skipping.typeztest.itr.tests_skipping.countz	test.fileztest.source.fileztest.source.startztest.source.endztest.codeownersztest.is_rum_activeztest.browser.driverztest.code_coverage.lines_pctFN).r   r   r   	COMPONENTTEST_COMMANDTEST_FRAMEWORKTEST_FRAMEWORK_VERSIONTEST_SESSION_NAME	TEST_NAME
TEST_SUITEENVERROR_STACK
ERROR_TYPEERROR_MESSAGESKIP_REASONrp   r   r   r   r   ATTEMPT_TO_FIX_PASSEDr   IS_RETRYRETRY_REASONr|   r   XFAIL_REASONTEST_RESULTr   r   r   r   r   r   r   r   r   	TEST_FILEr   r   
SOURCE_ENDr   r   r   CODE_COVERAGE_LINES_PCTr   r   r   r   r   ro     sX    ro   )+
__future__r   collectionsr   dataclassesr   enumr   r   ospathlibr   typingt"ddtrace.testing.internal.constantsr   r   r	   "ddtrace.testing.internal.telemetryr
   r   #ddtrace.testing.internal.tracer_apir   ddtrace.testing.internal.utilsr   r   r   r   r   r   r&   TypeVarr+   r-   Genericr.   NoReturnrh   ri   r   r   r   ro   r   r   r   r   <module>   sB    \7}+