
    Vh<                       d Z ddlmZ ddlZddlZddlZddlZddl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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d	lmZ dd
l m!Z!m"Z" ddl#m$Z$m%Z%m&Z&m'Z'm(Z( ddl)m*Z* ddl+m,Z,m-Z-m.Z.m/Z/ ddl0m1Z1 ddl2m3Z3 ddl4m5Z5m6Z6  ejn                  de$      Z8 G d dejr                  e8   ejt                        Z; G d de;e%         Z< G d de;e&         Z= G d d      Z>edd       Z?d dZ@d!dZAy)"z,Code coverage support for integration tests.    )annotationsN   )write_text_file)run_playbook)IntegrationConfig)COVERAGE_CONFIG_NAMEMODE_DIRECTORYMODE_DIRECTORY_WRITE	MODE_FILESubprocessErrorcachedisplaygenerate_nameget_generic_typeget_type_mapremove_treesanitize_host_nameverified_chmod)
ResultType)generate_coverage_configget_coverage_platform)
HostConfigPosixConfigWindowsConfigWindowsInventoryConfigWindowsRemoteConfig)data_context)ControllerProfileHostProfilePosixProfileSshTargetHostProfile)	HostState)LocalConnection)create_windows_inventorycreate_posix_inventoryTHostConfig)boundc                      e Zd ZdZddZddZeej                  dd              Z	ej                  dd       Z
ej                  dd       Zej                  dd       Zej                  dd       Zdd	Zy
)CoverageHandlerzDBase class for configuring hosts for integration test code coverage.c                X    || _         || _        || _        | j                         | _        y N)args
host_stateinventory_pathget_profilesprofiles)selfr,   r-   r.   s       d/home/dcms/DCMS/lib/python3.12/site-packages/ansible_test/_internal/commands/integration/coverage.py__init__zCoverageHandler.__init__V   s(    	$,))+    c                    t        t        |       t              }| j                  j                  D cg c]  }t        |j                  |      s| }}|S c c}w z4Return a list of profiles relevant for this handler.)r   typer   r-   target_profiles
isinstanceconfig)r1   profile_typeprofiler0   s       r2   r/   zCoverageHandler.get_profiles\   sK    'T
J?+/??+J+JwjY`YgYgiuNvGww xs   AAc                     y)4True if the handler should be used, otherwise False.N r1   s    r2   	is_activezCoverageHandler.is_activec       r4   c                     y Perform setup for code coverage.Nr?   r@   s    r2   setupzCoverageHandler.setuph   rB   r4   c                     y#Perform teardown for code coverage.Nr?   r@   s    r2   teardownzCoverageHandler.teardownl   rB   r4   c                     y)zCreate inventory, if needed.Nr?   r@   s    r2   create_inventoryz CoverageHandler.create_inventoryp   rB   r4   c                     y)RReturn a dictionary of environment variables for running tests with code coverage.Nr?   )r1   target_namealiasess      r2   get_environmentzCoverageHandler.get_environmentt   rB   r4   c                l    | j                          t        | j                  | j                  |d|       y)z7Run the specified playbook using the current inventory.F)capture	variablesN)rL   r   r,   r.   )r1   playbookrT   s      r2   r   zCoverageHandler.run_playbookx   s)    TYY 3 3XuXabr4   Nr,   r   r-   r"   r.   strreturnNonerX   zlist[HostProfile]rX   boolrX   rY   rO   rW   rP   ztuple[str, ...]rX   dict[str, str])rU   rW   rT   r_   rX   rY   )__name__
__module____qualname____doc__r3   r/   propertyabcabstractmethodrA   rF   rJ   rL   rQ   r   r?   r4   r2   r)   r)   S   s    N, C  C 	/ / 	2 2 	+ + 	a acr4   r)   )	metaclassc                       e Zd ZdZd fdZd fdZedd       Zedd       ZddZ	ddZ
ddZdd	Zdd
ZddZddZddZddZ xZS )PosixCoverageHandlerz9Configure integration test code coverage for POSIX hosts.c                L    t         |   |||       dt                | _        y )Nz/tmp/ansible-test-)superr3   r   common_temp_pathr1   r,   r-   r.   	__class__s       r2   r3   zPosixCoverageHandler.__init__   s(    z>: #5]_4E Fr4   c                    t         |          }|D cg c]U  }t        |t              rA|j                  j
                  | j                  j                  j                  j
                  k7  r|W }}|S c c}w r6   )rk   r/   r9   r   pythonpathr-   controller_profile)r1   r0   r<   rn   s      r2   r/   z!PosixCoverageHandler.get_profiles   sn    7')+3 [:gO`;aNN''4??+M+M+T+T+Y+YY  [ [ [s   AA2c                     y)r>   Tr?   r@   s    r2   rA   zPosixCoverageHandler.is_active   s     r4   c                l    | j                   r't        j                  t        | j                   d         S dS )zhThe POSIX target profile, if it uses a different Python interpreter than the controller, otherwise None.r   N)r0   tcastr    r@   s    r2   target_profilez#PosixCoverageHandler.target_profile   s)     :>qvvlDMM!$45PDPr4   c                D    | j                          | j                          yrD   )setup_controllersetup_targetr@   s    r2   rF   zPosixCoverageHandler.setup   s    r4   c                D    | j                          | j                          yrH   )teardown_controllerteardown_targetr@   s    r2   rJ   zPosixCoverageHandler.teardown   s      "r4   c                   t         j                  j                  | j                  t              }t         j                  j                  | j                  t
        j                  j                        }t        | j                        }t        ||d       t        |t               t        j                  |       t        |t               y)z2Perform setup for code coverage on the controller.T)create_directoriesN)osrq   joinrl   r   r   COVERAGEnamer   r,   r   r   r   mkdirr
   )r1   coverage_config_pathcoverage_output_pathcoverage_configs       r2   ry   z%PosixCoverageHandler.setup_controller   s    !ww||D,A,ACWX!ww||D,A,A:CVCVC[C[\2499=,oRVW+Y7
%&+-ABr4   c                    | j                   syt        | j                   t              ry| j                  d| j	                                y)z.Perform setup for code coverage on the target.Nzposix_coverage_setup.yml)rw   r9   r   r   get_playbook_variablesr@   s    r2   rz   z!PosixCoverageHandler.setup_target   s<    ""d))+<=4d6Q6Q6STr4   c                   t         j                  j                  | j                  t        j
                  j                        }t        | j                  j                        }t        j                  |      D ]v  }t        j                  t         j                  j                  ||      t         j                  j                  t        j
                  j                  t        ||                   x t        | j                         y)z5Perform teardown for code coverage on the controller.N)r   rq   r   rl   r   r   r   r   r,   
controllerlistdirshutilcopyfileupdate_coverage_filenamer   )r1   coverage_temp_pathplatformfilenames       r2   r|   z(PosixCoverageHandler.teardown_controller   s    WW\\$*?*?ATATAYAYZ()=)=>

#56 	^HOOBGGLL);XFU_UhUhUmUm  pH  IQ  S[  p\  I]  ^	^ 	D))*r4   c                   | j                   syt        | j                   t              ryt        j                  t
        | j                         }t        |j                        }|j                         d   }t        j                  dd      5 }	 |j                  | j                  t        j                  j                  |       |j!                  d       t        j"                         5 }t%        | j&                        }|j)                  ||       t*        j,                  j/                  |t        j                  j                        }t+        j0                  |      D ]v  }t3        j4                  t*        j,                  j/                  ||      t*        j,                  j/                  t        j                  j,                  t7        ||                   x 	 ddd       ddd       | j?                  d	| jA                                y# 1 sw Y   2xY w# t8        $ r"}	t;        j<                  d|	        Y d}	~	[d}	~	ww xY w# 1 sw Y   dxY w)
z1Perform teardown for code coverage on the target.Nr   zansible-test-coverage-z.tgz)prefixsuffix)chdirr   dst)r   srcz%Failed to download coverage results: zposix_coverage_teardown.yml)!rw   r9   r   ru   rv   r!   r   r:   !get_controller_target_connectionstempfileNamedTemporaryFilecreate_archiverl   r   r   r   seekTemporaryDirectoryr#   r,   extract_archiver   rq   r   r   r   r   r   r   r   warningr   r   )
r1   r<   r   concoverage_tgztemp_dir	local_conbase_dirr   exs
             r2   r}   z$PosixCoverageHandler.teardown_target   s   ""d))+<=&&-t/B/BC(8779!<((0HQWX 	`\h`"")>)>ZEXEXE]E]co"p !!!$002 `h /		 :I--H,-O!ww||Hj6I6I6N6NOH$&JJx$8 `Xx(H"'',,WaWjWjWoWo  rJ  KS  U]  r^  K_  ```	`" 	79T9T9VW` ` # N"Gt LMMN	` 	`sO   I6H%I)C/H
I
H	I	IH<7I<IIIc           	     ~   t         j                  j                  | j                  t              }t         j                  j                  | j                  t
        j                  j                  dj                  | j                  j                  |df            }| j                  j                  rd}t        ||      }|S )rN   =r    )_ANSIBLE_COVERAGE_CONFIG_ANSIBLE_COVERAGE_OUTPUT)r   rq   r   rl   r   r   r   r   r,   commandcoverage_checkdict)r1   rO   rP   config_filecoverage_filerT   s         r2   rQ   z$PosixCoverageHandler.get_environment   s    
 ggll4#8#8:NO T%:%:J<O<O<T<TVYV^V^`d`i`i`q`qs~  AK  `L  WM  N99##M%0%2
	
 r4   c                n    t        | j                  | j                  | j                  j                         yzCreate inventory.N)r%   r,   r.   r-   r8   r@   s    r2   rL   z%PosixCoverageHandler.create_inventory   s"    tyy$*=*=t?^?^_r4   c           
     \   t        | j                  t        | j                        t        j
                  j                  | j                  t              t        j
                  j                  | j                  t        j                  j                        t        dt        dt        d      S )zJReturn a dictionary of variables for setup and teardown of POSIX coverage.04o)common_temp_dirr   r   r   mode_directorymode_directory_write	mode_file)r   rl   r   r,   r   rq   r   r   r   r   r   r	   r
   r   r@   s    r2   r   z+PosixCoverageHandler.get_playbook_variables   sx     114TYY?!#d.C.CEY!Z!#d.C.CZEXEXE]E]!^,S1$8#="3
 	
r4   rV   rZ   r[   )rX   zt.Optional[PosixProfile]r]   r^   rX   r_   )r`   ra   rb   rc   r3   r/   rd   rA   rw   rF   rJ   ry   rz   r|   r}   rQ   rL   r   __classcell__rn   s   @r2   ri   ri   ~   sl    CG   Q Q

CU+X>,`

r4   ri   c                  ^     e Zd ZdZd	 fdZed
d       ZddZddZddZ	ddZ
ddZ xZS )WindowsCoverageHandlerz;Configure integration test code coverage for Windows hosts.c                L    t         |   |||       dt                | _        y )NzC:\ansible_test_coverage_)rk   r3   r   remote_temp_pathrm   s       r2   r3   zWindowsCoverageHandler.__init__  s(    z>: #=]_<M Nr4   c                ^    t        | j                        xr | j                  j                   S )r>   )r\   r0   r,   r   r@   s    r2   rA   z WindowsCoverageHandler.is_active  s%     DMM"C499+C+C'CCr4   c                D    | j                  d| j                                y)rE   zwindows_coverage_setup.ymlN)r   r   r@   s    r2   rF   zWindowsCoverageHandler.setup  s    68S8S8UVr4   c           	        t        j                         5 }| j                         }|j                  |       | j	                  d|       t        j                  |      D ]:  }t        d | j                  D              rd}n)t        d | j                  D              rd}n
t               | dt        t
        j                  j                  |      d          }t        j                  t
        j                  j                  ||            5 }|j!                         D ]o  }|j#                         rt%        d	|j&                         t)        |j&                  |      |_        |j+                  |t,        j.                  j                         q 	 d
d
d
       = 	 d
d
d
       y
# 1 sw Y   RxY w# 1 sw Y   y
xY w)rI   )local_temp_pathzwindows_coverage_teardown.ymlc              3  P   K   | ]  }t        |j                  t                 y wr+   )r9   r:   r   .0r<   s     r2   	<genexpr>z2WindowsCoverageHandler.teardown.<locals>.<genexpr>'  s     d7z'..2EFd   $&remotec              3  P   K   | ]  }t        |j                  t                 y wr+   )r9   r:   r   r   s     r2   r   z2WindowsCoverageHandler.teardown.<locals>.<genexpr>)  s     iPWGNN4JKir   	inventory-r   z"Unexpected directory in zip file: N)r   r   r   updater   r   r   allr0   NotImplementedErrorr   rq   splitextzipfileZipFiler   infolistis_dir	Exceptionr   r   extractr   r   )r1   r   rT   r   r   r   coverage_zipitems           r2   rJ   zWindowsCoverageHandler.teardown  s   ((* 	Mo335I /   =yIJJ7 MdVZVcVcdd%Fi[_[h[hii(F-//$XQ'9"'':J:J8:TUV:W'X&YZ__RWW\\/8%LM MQ] , 5 5 7 M;;="+.PQUQ^Q^P_,`"aa(@PX(Y$,,T:3F3F3K3KLMM MM	M 	M$M M%	M 	Ms%   C9F4BF'F4'F1,F44F=c                4   dj                  | j                  j                  |df      }t        t        j
                  j                  | j                  |      t        j
                  j                  t               j                  j                  d            }|S )rN   r   r   *)_ANSIBLE_COVERAGE_REMOTE_OUTPUT$_ANSIBLE_COVERAGE_REMOTE_PATH_FILTER)
r   r,   r   r   r   rq   r   r   contentroot)r1   rO   rP   coverage_namerT   s        r2   rQ   z&WindowsCoverageHandler.get_environment9  so    
 $))"3"3[*!MN,.GGLL9N9NP],^13ln>T>T>Y>Y[^1_
	
 r4   c                n    t        | j                  | j                  | j                  j                         yr   )r$   r,   r.   r-   r8   r@   s    r2   rL   z'WindowsCoverageHandler.create_inventoryG  s"     D,?,?A`A`ar4   c                .    t        | j                        S )zLReturn a dictionary of variables for setup and teardown of Windows coverage.)r   )r   r   r@   s    r2   r   z-WindowsCoverageHandler.get_playbook_variablesK  s    !22
 	
r4   rV   r[   r]   r^   r   )r`   ra   rb   rc   r3   rd   rA   rF   rJ   rQ   rL   r   r   r   s   @r2   r   r   
  s>    EO D DWM:b
r4   r   c                  0    e Zd ZdZddZddZddZd	dZy)
CoverageManagerz2Manager for code coverage configuration and state.c                R   || _         || _        || _        | j                   j                  r.t	        d |j
                  D              }|j                  d        n
t	               }|D cg c]  } ||||       }}|D cg c]  }|j                  s| c}| _        y c c}w c c}w )Nc              3  X   K   | ]"  }t        t        |j                               $ y wr+   )get_handler_typer7   r:   r   s     r2   r   z+CoverageManager.__init__.<locals>.<genexpr>[  s     j7 0gnn1E Fjs   (*)r,   r-   r.   )	r,   r-   r.   coveragesetr0   discardrA   handlers)r1   r,   r-   r.   handler_typeshandler_typer   handlers           r2   r3   zCoverageManager.__init__U  s    	$,99jV`ViVijjM!!$'EM wD  EfrLdzR`a  E  E08NWG<M<MN ENs   (B B$B$c                t    | j                   j                  sy| j                  D ]  }|j                           yrD   )r,   r   r   rF   r1   r   s     r2   rF   zCoverageManager.setupd  s.    yy!!}} 	GMMO	r4   c                t    | j                   j                  sy| j                  D ]  }|j                           yrH   )r,   r   r   rJ   r   s     r2   rJ   zCoverageManager.teardownl  s1    yy!!}} 	G	r4   c                    | j                   j                  rd|v ri S i }| j                  D ]#  }|j                  |j	                  ||             % |S )rN   z
non_local/)r,   r   r   r   rQ   )r1   rO   rP   envr   s        r2   rQ   zCoverageManager.get_environmentt  sU    yy!!\W%<I}} 	FGJJw..{GDE	F 
r4   NrV   r]   r^   )r`   ra   rb   rc   r3   rF   rJ   rQ   r?   r4   r2   r   r   R  s    <O
r4   r   c                 *    t        t        t              S )zICreate and return a mapping of HostConfig types to CoverageHandler types.)r   r)   r   r?   r4   r2   get_config_handler_type_mapr     s     44r4   c                    | g}t               }|rD|j                  d      } |j                  |       }|r|S |j                  | j                         |rDy)zlReturn the coverage handler type associated with the given host config type if found, otherwise return None.r   N)r   popgetextend	__bases__)config_typequeuetype_mapr   s       r2   r   r     sT    ME*,H
iil||K0[**+  r4   c                    | j                  d      }| t        j                  j                  |       k7  st	        |      dk7  s|d   dk7  rt        d|        ||d<   dj                  |      }t        j                  d| d|  d| d	
       |S )zVValidate the given filename and insert the specified platform, then return the result.r         r   zUnexpected coverage filename: zCoverage file for platform "z": z -> r   )	verbosity)	splitr   rq   basenamelenr   r   r   info)original_filenamer   partsupdated_filenames       r2   r   r     s    ##C(EBGG,,->??3u:QR?V[\]V^blVl89J8KLMME!HxxLL/z=N<OtTdSefrstr4   )rX   z1dict[t.Type[HostConfig], t.Type[CoverageHandler]])r   zt.Type[HostConfig]rX   z#t.Optional[t.Type[CoverageHandler]])r  rW   r   rW   rX   rW   )Brc   
__future__r   re   r   r   r   typingru   r   ior   ansible_utilr   r:   r   utilr   r	   r
   r   r   r   r   r   r   r   r   r   r   util_commonr   coverage_utilr   r   host_configsr   r   r   r   r   datar   host_profilesr   r   r    r!   provisioningr"   connectionsr#   r   r$   r%   TypeVarr&   GenericABCMetar)   ri   r   r   r   r   r   r?   r4   r2   <module>r     s    2 " 
 	        
  
 aiiZ8(caii, (cVI
?;7 I
XE
_]; E
P, ,^ 5 5
"r4   