
    f                     6   d 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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 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! er>es< ejD                         5   ejF                  d       ddl$Z$ddl%Z%ddl&Z&ddl'Z'ddd       erddl(m)Z) ejT                  jV                  Z+ ejX                  e d       ejX                  ed       ejX                  exr e d       G d de                           Z-d Z.e/fdZ0 G d de-      Z1 G d  d!e-      Z2 G d" d#e-      Z3 G d$ d%e-      Z4 G d& d'e-      Z5 ejX                  e d       G d( d)e             Z6 ejX                  e d       G d* d+e             Z7 ejX                  e d       G d, d-e             Z8e9d.k(  rdd/l:m;Z;  e;e<       yy# 1 sw Y   5xY w)0zWindows specific tests.    N)WINDOWS)FileNotFoundError)super)which)APPVEYOR)GITHUB_ACTIONS)HAS_BATTERY)IS_64BIT)PY3)PYPY)TOLERANCE_DISK_USAGE)TOLERANCE_SYS_MEM)PsutilTestCase)mock)retry_on_failure)sh)spawn_testproc)	terminateignore)convert_oserrorzWINDOWS onlyzpywin32 not available on PYPYzpywin32 broken on GITHUB + PY2c                       e Zd Zy)WindowsTestCaseN)__name__
__module____qualname__     ;/usr/lib/python3/dist-packages/psutil/tests/test_windows.pyr   r   ;   s    
 	r   r   c                 h    t        d      st        j                  d      dd| z  z   }t        |      S )zCurrently not used, but available just in case. Usage:

    >>> powershell(
        "Get-CIMInstance Win32_PageFileUsage | Select AllocatedBaseSize")
    zpowershell.exezpowershell.exe not availablez?powershell.exe -ExecutionPolicy Bypass -NoLogo -NonInteractive z,-NoProfile -WindowStyle Hidden -Command "%s")r   unittestSkipTestr   )cmdcmdlines     r   
powershellr$   C   s@     !" >??I
83
>	?  g;r   c                 $   t        d| d|      j                         }dj                  |j                         dd       j                         }|9d|v r-t	        |j                         D cg c]
  } ||       c}      S  ||      S |S c c}w )zCurrently not used, but available just in case. Usage:

    >>> wmic("Win32_OperatingSystem", "FreePhysicalMemory")
    2134124534
    z
wmic path z get     N,)r   stripjoin
splitlinestuplesplit)pathwhat	converteroutdataxs         r   wmicr4   R   s     dD1
2
8
8
:C773>>#AB'(..0D$;

=1)A,=>>T?"	 >s   -Bc                   t    e Zd Z ej                  dej                  vd      d        Zd Zd Z	d Z
d Zd Zy	)
TestCpuAPIsNUMBER_OF_PROCESSORSz-NUMBER_OF_PROCESSORS env var is not availablec                     t        t        j                  d         }| j                  |t	        j
                                y )Nr7   )intosenvironassertEqualpsutil	cpu_count)selfnum_cpuss     r   &test_cpu_count_vs_NUMBER_OF_PROCESSORSz2TestCpuAPIs.test_cpu_count_vs_NUMBER_OF_PROCESSORSi   s1     rzz"89:6#3#3#56r   c                 ~    t        j                         d   }t        j                         }| j	                  ||       y )N   )win32apiGetSystemInfor=   r>   r<   r?   	sys_valuepsutil_values      r   test_cpu_count_vs_GetSystemInfoz+TestCpuAPIs.test_cpu_count_vs_GetSystemInfos   s5     **,Q/	'')L1r   c                     t        j                         }t        d |j                         D              }| j	                  t        j                         |       y )Nc              3   4   K   | ]  }|j                     y wN)NumberOfLogicalProcessors.0procs     r   	<genexpr>z<TestCpuAPIs.test_cpu_count_logical_vs_wmi.<locals>.<genexpr>|   s      
/3D**
   wmiWMIsumWin32_Processorr<   r=   r>   )r?   wprocss      r   test_cpu_count_logical_vs_wmiz)TestCpuAPIs.test_cpu_count_logical_vs_wmiz   sH    GGI 
787H7H7J
 
 	))+U3r   c                     t        j                         }t        d |j                         D              }| j	                  t        j                  d      |       y )Nc              3   4   K   | ]  }|j                     y wrL   )NumberOfCoresrN   s     r   rQ   z:TestCpuAPIs.test_cpu_count_cores_vs_wmi.<locals>.<genexpr>   s     G4D&&GrR   F)logicalrS   )r?   rX   coress      r   test_cpu_count_cores_vs_wmiz'TestCpuAPIs.test_cpu_count_cores_vs_wmi   sA    GGIG13D3D3FGG))%8%@r   c                     | j                  t        j                         t        t        j                  d                   y )NT)percpu)r<   r=   r>   len	cpu_timesr?   s    r   test_cpu_count_vs_cpu_timesz'TestCpuAPIs.test_cpu_count_vs_cpu_times   s.    F$4$4D$A B	
r   c                 2   t        j                         }|j                         d   }| j                  |j                  t        j                         j                         | j                  |j                  t        j                         j                         y Nr   )
rT   rU   rW   r<   CurrentClockSpeedr=   cpu_freqcurrentMaxClockSpeedmax)r?   rX   rP   s      r   test_cpu_freqzTestCpuAPIs.test_cpu_freq   sf    GGI  "1%//1B1J1JK++V__->-B-BCr   N)r   r   r   r    skipIfr:   r;   rA   rI   rZ   r`   rf   rn   r   r   r   r6   r6   h   sI    X__bjj077	724A


Dr   r6   c                       e Zd Zd Zd Zd Zd Zd Z ej                  e
d       e       d               Z e       d        Z e       d	        Zd
 Zd Zd Zd Zy)TestSystemAPIsc                     t        d      }t        j                  d      j                         }|D ]=  }d|j	                  dd      j                         v r&||vs+| j                  d|z         y )Nzipconfig /allT)perniczpseudo-interface -z-%r nic wasn't found in 'ipconfig /all' output)r   r=   net_io_counterskeysreplacelowerfail)r?   r1   nicsnics       r   test_nic_nameszTestSystemAPIs.test_nic_names   ss    !%%T2779 	C!S[[c%:%@%@%BB#~iiCcI 		r   c                     t        j                         j                         d   }| j                  t	        |j
                        t        j                         j                         y rh   )	rT   rU   Win32_ComputerSystemr<   r9   TotalPhysicalMemoryr=   virtual_memorytotalr?   rX   s     r   test_total_phymemz TestSystemAPIs.test_total_phymem   sH    GGI**,Q/%%&(=(=(?(E(E	
r   c                     t        j                         j                         d   }| j                  t	        |j
                        t        j                         j                  t               y )Nr   delta)
rT   rU   Win32_PerfRawData_PerfOS_MemoryassertAlmostEqualr9   AvailableBytesr=   r   freer   r   s     r   test_free_phymemzTestSystemAPIs.test_free_phymem   sQ    GGI557:  !!!#((# 	 	
r   c                 
   t        j                         j                         d   }| j                  t	        |j
                        t        j                         j                  z
  t        j                         j                         t        j                         j                  dk(  r]| j                  dt        j                         j                         | j                  dt        j                         j                         y y rh   )rT   rU   r   r<   r9   CommitLimitr=   r   r   swap_memoryr   usedr   s     r   test_total_swapmemz!TestSystemAPIs.test_total_swapmem   s    GGI557:!6!6!8!>!>> &&	
 %%*Q 2 2 4 9 9:Q 2 2 4 9 9: +r   c                 
   t        j                         j                  dkD  rt        j                         j                  d      d   }t        |j                        dz  t        |j                        z  }| j                  t        j                         j                  d       | j                  t        j                         j                  |d       | j                  t        j                         j                  d       y y )Nr   _Total)Named   rC   r   )r=   r   r   rT   rU   #Win32_PerfRawData_PerfOS_PagingFiler9   PercentUsagePercentUsage_BaseassertGreaterEqualpercentr   assertLessEqual)r?   rX   percentSwaps      r   test_percent_swapmemz#TestSystemAPIs.test_percent_swapmem   s    %%)	==8=LQOAann-3c!:M:M6NNK ##F$6$6$8$@$@!D""""$,,k #    !3!3!5!=!=sC *r   ztest not relieable on appveyorc                     t        j                         j                         }t        |D cg c]  }|j                   c}      }t        t        j                               }| j                  ||       y c c}w rL   )rT   rU   Win32_Processset	ProcessIdr=   pidsr<   )r?   rX   r3   wmi_pidspsutil_pidss        r   	test_pidszTestSystemAPIs.test_pids   sV    
 GGI##%Q//0&++-(;/ 0s   A6c                 4   t        j                  d      }t        j                         j	                         }|D ]I  }|D ]%  }|j
                  j                  dd      |j                  k(  s.|j                  s Bd|j                  v r R|j                  j                  d      r o	 t        j                  |j                        }| j                  |j                  t        |j                                t        |j"                        }| j                  |j$                  |       t'        |j$                  |z
        dkD  r!| j)                  d|j$                  d	|       . | j)                  d
t+        |      z         y # t        $ r Y  [w xY w)NTall\r&   cdromA:i   zpsutil=z, wmi=zcan't find partition %s)r=   disk_partitionsrT   rU   Win32_LogicalDiskdevicerx   DeviceID
mountpointopts
startswith
disk_usager   r<   r   r9   Size	FreeSpacer   absrz   repr)r?   ps_parts	wmi_partsps_partwmi_partusagewmi_frees          r   
test_diskszTestSystemAPIs.test_disks   s_   ))d3GGI//1	 	KG% K>>))$3x7H7HH"--',,.))44T: & 1 1'2D2D E $$U[[#hmm2DE"8#5#56H$$UZZ:5::014DD"ii38::xH  -K0 ii 9DM IJJ3	K - s   +F			FFc                    t        j                         D ]  }d|j                  v rt        j                  |j
                        }t        j                  |j
                        }| j                  |d   |j                  t               | j                  |d   |j                  t               | j                  |j                  |j                  |j                  z
          y )Nr   r   r   r'   )r=   r   r   rD   GetDiskFreeSpaceExr   r   r   r   r   r   r<   r   )r?   diskrG   rH   s       r   test_disk_usagezTestSystemAPIs.test_disk_usage   s    **, 	D$))# 33DOODI!,,T__=L""!l//7K #  ""!l008L #  !!<#5#58I8I#I	r   c                 X   t        j                         j                  d      D cg c]  }|r|j                  d      s|dz    }}t	        j
                  d      D cg c])  }|j                  j                  d      s|j                  + }}| j                  ||       y c c}w c c}w )Nz\ r   r   Tr   )rD   GetLogicalDriveStringsr-   r   r=   r   r   r<   )r?   r3   rG   rH   s       r   test_disk_partitionsz#TestSystemAPIs.test_disk_partitions	  s     446<<XF
d+ H
	 
 ++5
<<**40 LL
 

 	L1


s   B".B'c                 F   t        t        j                               }t        j                         j                         }t               }|D ]8  }|j                  |j                         |j                  |j                         : | j                  ||z  d|d|       y )Nzno common entries in z, )
r   cextnet_if_statsrT   rU   Win32_NetworkAdapteraddr   NetConnectionID
assertTrue)r?   ps_nameswmi_adapters	wmi_nameswmi_adapters        r   test_net_if_statsz TestSystemAPIs.test_net_if_stats  s    t((*+wwy557E	' 	7KMM+**+MM+556	7 	y -5yA	
r   c                    t        j                         j                         }|d   j                  j	                  d      d   }t
        j
                  j                  |d      }t
        j
                  j                  t        j                               }t        ||z
  j                               }| j                  |d       y )Nr   .%Y%m%d%H%M%SrC   )rT   rU   Win32_OperatingSystemLastBootUpTimer-   datetimestrptimefromtimestampr=   	boot_timer   total_secondsr   )r?   wmi_oswmi_btime_strwmi_btime_dt	psutil_dtdiffs         r   test_boot_timezTestSystemAPIs.test_boot_time"  s    002q	0066s;A>((11>
 %%33F4D4D4FG	L9,;;=>T1%r   c                    t        j                  dd      5  | j                  t        j                         d       d d d        t        j                  dd      5  | j                  t        j                         d       d d d        t        j                  dd      5  | j                  t        j                         d       d d d        t        j                  dd      5  | j                  t        j                         d       d d d        y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   fxY w# 1 sw Y   y xY w)Nz psutil._pswindows.cext.boot_timerC   return_value      iM  )r   patchr<   r=   r   re   s    r   test_boot_time_fluctuationz)TestSystemAPIs.test_boot_time_fluctuation,  s    ZZ:K 	4V--/3	4ZZ:K 	4V--/3	4ZZ:K 	4V--/3	4ZZ:M 	6V--/5	6 	6	4 	4	4 	4	4 	4	6 	6s/   %D%D %D*$%D6DD'*D36D?N)r   r   r   r}   r   r   r   r   r    ro   r   r   r   r   r   r   r   r   r   r   r   r   rq   rq      s    	

;D2 X__X?@0  A0 K K<   2

&	6r   rq   c                       e Zd Zd Z ej
                  e d      d        Z ej
                  e d      d        Zd Z	d Z
d Zd Zy	)
TestSensorsBatteryc                     t        j                         d   r$| j                  t        j                                y | j                  t        j                                y )NSystemBatteriesPresent)rD   GetPwrCapabilitiesassertIsNotNoner=   sensors_batteryassertIsNonere   s    r   test_has_batteryz#TestSensorsBattery.test_has_battery>  sB    &&()AB  !7!7!9:f4467r   z
no batteryc                     t        j                         }|j                  d      d   }t        j                         }| j                  |j                  |j                  d       y )Nselect * from Win32_Batteryr   r'   r   )rT   rU   queryr=   r   r   r   EstimatedChargeRemainingr?   rX   battery_wmibattery_psutils       r   test_percentzTestSensorsBattery.test_percentD  sW    GGIgg;<Q?//1""00 	 	
r   c                     t        j                         }|j                  d      d   }t        j                         }| j                  |j                  |j                  dk(         y )Nr   r      )rT   rU   r   r=   r   r<   power_pluggedBatteryStatusr   s       r   test_power_pluggedz%TestSensorsBattery.test_power_pluggedO  sU    GGIgg;<Q?//1 	((+*C*Cq*H	
r   c                     t        j                  dd      5 }| j                  t        j                                |j
                  sJ 	 d d d        y # 1 sw Y   y xY w)N&psutil._pswindows.cext.sensors_battery)r      r   r   r   )r   r   r   r=   r   calledr?   ms     r   test_emulate_no_batteryz*TestSensorsBattery.test_emulate_no_batteryZ  sP    ZZ4'
 	 f446788O8	 	 	s   2AAc                     t        j                  dd      5 }| j                  t        j                         j
                  t        j                         |j                  sJ 	 d d d        y # 1 sw Y   y xY w)Nr   )r'   r   r   r   r   r   r   r<   r=   r   secsleftPOWER_TIME_UNLIMITEDr  r  s     r   test_emulate_power_connectedz/TestSensorsBattery.test_emulate_power_connectedb  `    ZZ4<
 	&&(1163N3N 88O8	 	 	   AA--A6c                     t        j                  dd      5 }| j                  t        j                         j
                  t        j                         |j                  sJ 	 d d d        y # 1 sw Y   y xY w)Nr   )r      r   r   r   r  r  s     r   test_emulate_power_chargingz.TestSensorsBattery.test_emulate_power_chargingk  r  r  c                     t        j                  dd      5 }| j                  t        j                         j
                  t        j                         |j                  sJ 	 d d d        y # 1 sw Y   y xY w)Nr   )r   r   r   r   )r   r   r<   r=   r   r  POWER_TIME_UNKNOWNr  r  s     r   test_emulate_secs_left_unknownz1TestSensorsBattery.test_emulate_secs_left_unknownt  sc    ZZ4&
 	 &&(1163L3L 88O8	 	 	r  N)r   r   r   r   r    ro   r	   r   r   r  r
  r  r  r   r   r   r   r   =  sa    8 X___l3
 4
 X___l3
 4
r   r   c                       e Zd Zed        Ze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y)TestProcessc                 6    t               j                  | _        y rL   r   pidclss    r   
setUpClasszTestProcess.setUpClass       "&&r   c                 .    t        | j                         y rL   r   r  r  s    r   tearDownClasszTestProcess.tearDownClass      #''r   c                     t        j                  d      }| j                  t         j                  |j                         y rh   )r=   ProcessassertRaisesAccessDeniedkillr?   ps     r   test_issue_24zTestProcess.test_issue_24  s*    NN1&--qvv6r   c                    t        j                  d      }| j                  |j                         d       t	        |       |j                          | j                  |j                         d       	 |j                         d d \  }}| j                  |d       y # t         j                  $ r t        j                         d   dvr Y y w xY w)Nr   Systemg        r   r   r'   )vistazwin-7win7)r=   r"  r<   namestrusernamer   create_timememory_infoassertGreaterr$  platformuname)r?   r'  rssvmss       r   test_special_pidzTestProcess.test_special_pid  s    NN18, 	A	

5	'}}r*HC sA& "" 	~~"*DD E	s   2B -C
Cc                     t        j                  | j                        }| j                  t        |j
                  t        j                         y rL   )r=   r"  r  r#  
ValueErrorsend_signalsignalSIGINTr&  s     r   test_send_signalzTestProcess.test_send_signal  s.    NN488$*ammV]]Cr   c                    t        j                  t        j                               }|j	                         }t        j                  t        j                  t        j                  t        j                               }|j	                         }| j                  ||dz          t        j                  |       | j                  |j	                         |       y )Nr'   )r=   r"  r:   getpidnum_handlesrD   OpenProcesswin32conPROCESS_QUERY_INFORMATIONFALSEr<   CloseHandle)r?   r'  beforehandleafters        r   test_num_handles_incrementz&TestProcess.test_num_handles_increment  s    NN299;'%%..		
 
+V$&1r   c                    t        j                  | j                         j                        }|j	                  t
        j                         |j	                  t
        j                         |j                          |j                          | j                  t         j                  |j                  t
        j                         | j                  t         j                  |j                  t
        j                         y rL   )r=   r"  r   r  r:  r;  CTRL_C_EVENTCTRL_BREAK_EVENTr%  waitr#  NoSuchProcessr&  s     r   test_ctrl_signalszTestProcess.test_ctrl_signals  s    NN4..0445	f))*	f--.		  !--1D1D	
 	  !--1H1H	
r   c                     t        j                  t        j                        }|j	                  d      rt        j                  d      | j                  t        j                         j                         |       y )N$zrunning as service account)rD   GetUserNameExrB  NameSamCompatibleendswithr    r!   r<   r=   r"  r/  )r?   r-  s     r   test_usernamezTestProcess.test_username  sX    %%h&@&@A== ##$@AA)224d;r   c                 F   t        j                  ddt        j                               j	                         }dj                  t        j                         j                               }|d   dcxk(  r|d   k7  rn n|j                  ddd      }| j                  ||       y )Nz[ ]+rt   r   "r&   r   )resubrD   GetCommandLiner)   r*   r=   r"  r#   rx   r<   rF   s      r   test_cmdlinezTestProcess.test_cmdline  s    FF63(?(?(ABHHJ	xx 0 8 8 :;Q<31,q/1
 "))#r15IL1r   c                 `   t        j                  t        j                  t        j                  t        j                               }| j                  t         j                  |       t        j                  |      }t        j                         j                         }| j                  ||       y rL   )rD   rA  rB  rC  rD  r:   r?  
addCleanuprE  win32processGetPriorityClassr=   r"  nicer<   r?   rG  rG   rH   s       r   	test_nicezTestProcess.test_nice  st    %%..		
 	,,f5 11&9	~~',,.y1r   c                    t        j                  t        j                  t        j                  | j
                        }| j                  t         j                  |       t        j                  |      }t        j                  | j
                        j                         }| j                  |d   |j                         | j                  |d   |j                         | j                  |d   |j                          | j                  |d   |j"                         | j                  |d   |j$                         | j                  |d   |j&                         | j                  |d   |j(                         | j                  |d   |j*                         | j                  |j,                  |j                         | j                  |j.                  |j(                         y )	NPeakWorkingSetSizeWorkingSetSizeQuotaPeakPagedPoolUsageQuotaPagedPoolUsageQuotaPeakNonPagedPoolUsageQuotaNonPagedPoolUsagePagefileUsagePeakPagefileUsage)rD   rA  rB  rC  rD  r  r]  rE  r^  GetProcessMemoryInfor=   r"  r1  r<   	peak_wsetwsetpeak_paged_pool
paged_poolpeak_nonpaged_poolnonpaged_poolpagefilepeak_pagefiler5  r6  ra  s       r   test_memory_infozTestProcess.test_memory_info  s   %%..
 	,,f5 55f=	~~dhh/;;=*+\-C-C	
 	#34l6G6GH/0,2N2N	
 	+,l.E.E	
 	23++	
 	./1K1K	
 	?3\5J5JK)*L,F,F	
 	))<+<+<=))<+@+@Ar   c                    t        j                  t        j                  t        j                  | j
                        }| j                  t         j                  |       t        j                  | j
                        }|j                          |j                         }t        j                  |      }| j                  ||       y rL   )rD   rA  rB  rC  rD  r  r]  rE  r=   r"  r   rM  r^  GetExitCodeProcessr<   )r?   rG  r'  rH   rG   s        r   	test_waitzTestProcess.test_wait
  s    %%..
 	,,f5NN488$	vvx 33F;	y1r   c                 ~   d }t        j                  t        j                  t        j                  | j
                        }| j                  t         j                  |        |t        j                  |      d         }t        j                  | j
                        j                         }| j                  ||       y )Nc                 P    t        d      D cg c]  }d|z  | z  s| c}S c c}w )N@   r'   )range)r3   is     r   from_bitmaskz3TestProcess.test_cpu_affinity.<locals>.from_bitmask  s$    $Ry9!Q!VqLA999s   ##r   )rD   rA  rB  rC  rD  r  r]  rE  r^  GetProcessAffinityMaskr=   r"  cpu_affinityr<   )r?   r~  rG  rG   rH   s        r   test_cpu_affinityzTestProcess.test_cpu_affinity  s    	: %%..
 	,,f5 //7:
	 ~~dhh/<<>y1r   c                    t        j                  t        j                  t        j                  t        j                               }| j                  t         j                  |       t        j                  |      }t        j                         j                         }| j                  |j                  |d          | j                  |j                   |d          | j                  |j"                  |d          | j                  |j$                  |d          | j                  |j&                  |d          | j                  |j(                  |d          y )NReadOperationCountWriteOperationCountReadTransferCountWriteTransferCountOtherOperationCountOtherTransferCount)rD   rA  rB  rC  rD  r:   r?  r]  rE  r^  GetProcessIoCountersr=   r"  io_countersr<   
read_countwrite_count
read_byteswrite_bytesother_countother_bytesra  s       r   test_io_counterszTestProcess.test_io_counters#  s(   %%..		
 	,,f5 55f=	~~'335##Y/C%D	
 	$$i0E&F	
 	##Y/B%C	
 	$$i0D&E	
 	$$i0E&F	
 	$$i0D&E	
r   c                    dd l }dd l}d}|j                  j                  j	                  |d| j
                        }| j                  |j                  j                  j                  |       |j                  j                         }|j                  j                  j                  ||j                  |             |j                  }t        j                  | j
                        j                         }| j!                  ||       y )Nr      )ctypesctypes.wintypeswindllkernel32rA  r  r]  rE  wintypesDWORDGetProcessHandleCountbyrefvaluer=   r"  r@  r<   )r?   r  rC  rG  hndcntrG   rH   s          r   test_num_handleszTestProcess.test_num_handles=  s    $)!''33%q$((
 	..::FC&&(44FLL(	
 LL	~~dhh/;;=y1r   c                    t               }d|_        t        j                  d|      5  t        j                  d      5 }t	        j
                         }| j                  t        j                  |j                         d d d        d d d        | j                  j                  d       y # 1 sw Y   .xY w# 1 sw Y   2xY w)Ni+  z psutil._psplatform.cext.proc_cwdside_effectz
time.sleeprC   )WindowsErrorwinerrorr   r   r=   r"  r#  r$  cwdr   
call_count)r?   excr  r'  s       r   test_error_partial_copyz#TestProcess.test_error_partial_copyO  s    nZZ:L 	>L) >QNN$!!&"5"5quu=>	> 	a0> >	> 	>s"   B7?B+>B7+B4	0B77C c                     t        j                         d   dz   }t         j                  j                  |      }| j	                  t         j
                  |j                         y )Nr  i )r=   r   _psplatformr"  r#  rN  exe)r?   r  rP   s      r   test_exezTestProcess.test_exeY  sI     kkmB%'!!))#.&..9r   N)r   r   r   classmethodr  r  r(  r7  r=  rI  rO  rU  r[  rb  ru  rx  r  r  r  r  r  r   r   r   r  r    sv    ' '  7'"D	2
<	242B@	22
42$1:r   r  c                       e Zd ZdZed        Zed        Zd Z ej                  e
d      d        Zd Zd Z e       d	        Z e       d
        Zd Zy)TestProcessWMIz%Compare Process API results with WMI.c                 6    t               j                  | _        y rL   r  r  s    r   r  zTestProcessWMI.setUpClassd  r  r   c                 .    t        | j                         y rL   r  r  s    r   r  zTestProcessWMI.tearDownClassh  r   r   c                     t        j                         j                  | j                        d   }t	        j
                  | j                        }| j                  |j                         |j                         y Nr   r   )	rT   rU   r   r  r=   r"  r<   r-  Captionr?   rX   r'  s      r   	test_namezTestProcessWMI.test_namel  sP    GGI##dhh#7:NN488$199-r   z!unreliable path on GITHUB_ACTIONSc                 0   t        j                         j                  | j                        d   }t	        j
                  | j                        }| j                  |j                         j                         |j                  j                                y r  )
rT   rU   r   r  r=   r"  r<   r  ry   ExecutablePathr  s      r   r  zTestProcessWMI.test_exer  sc    GGI##dhh#7:NN488$ 	!*:*:*@*@*BCr   c                 6   t        j                         j                  | j                        d   }t	        j
                  | j                        }| j                  dj                  |j                               |j                  j                  dd             y )Nr  r   rt   rW  r&   )rT   rU   r   r  r=   r"  r<   r*   r#   CommandLinerx   r  s      r   r[  zTestProcessWMI.test_cmdlinez  sf    GGI##dhh#7:NN488$!))+.0E0Ec20NOr   c                    t        j                         j                  | j                        d   }t	        j
                  | j                        }|j                         \  }}}|d|}| j                  |j                         |       y )Nr  r   r   )	rT   rU   r   r  r=   r"  GetOwnerr<   r/  )r?   rX   r'  domain_r/  s         r   rU  zTestProcessWMI.test_username  sh    GGI##dhh#7:NN488$jjl8%x0x0r   c                 "   t        j                         j                  | j                        d   }t	        j
                  | j                        }|j                         j                  }| j                  |t        |j                               y r  )rT   rU   r   r  r=   r"  r1  r5  r<   r9   re  )r?   rX   r'  r5  s       r   test_memory_rsszTestProcessWMI.test_memory_rss  sb    GGI##dhh#7:NN488$mmo!!c!"2"234r   c                 B   t        j                         j                  | j                        d   }t	        j
                  | j                        }|j                         j                  }t        |j                        }|||dz  fvr| j                  d|d|      y )Nr  r   r  zwmi=z	, psutil=)rT   rU   r   r  r=   r"  r1  r6  r9   PageFileUsagerz   )r?   rX   r'  r6  	wmi_usages        r   test_memory_vmszTestProcessWMI.test_memory_vms  s    GGI##dhh#7:NN488$mmo!!
 (	y)d"233))9cBCC 4r   c                    t        j                         j                  | j                        d   }t	        j
                  | j                        }t        |j                  j                  d      d         }t        j                  dt        j                  |j                                     }| j                  ||       y )Nr  r   r   r   )rT   rU   r   r  r=   r"  r.  CreationDater-   timestrftime	localtimer0  r<   )r?   rX   r'  wmic_createpsutil_creates        r   test_create_timezTestProcessWMI.test_create_time  s    GGI##dhh#7:NN488$!....s3A67DNN1==?;
 	m4r   N)r   r   r   __doc__r  r  r  r  r    ro   r   r  r[  rU  r   r  r  r  r   r   r   r  r  a  s    /' '  . X__^%HID JDP
1 5 5 
D 
D5r   r  c                   T    e Zd ZdZed        Zed        Zd Zd Zd Z	d Z
d Zd	 Zy
)TestDualProcessImplementationaw  Certain APIs on Windows have 2 internal implementations, one
    based on documented Windows APIs, another one based
    NtQuerySystemInformation() which gets called as fallback in
    case the first fails because of limited permission error.
    Here we test that the two methods return the exact same value,
    see:
    https://github.com/giampaolo/psutil/issues/304.
    c                 6    t               j                  | _        y rL   r  r  s    r   r  z(TestDualProcessImplementation.setUpClass  r  r   c                 .    t        | j                         y rL   r  r  s    r   r  z+TestDualProcessImplementation.tearDownClass  r   r   c                 `   t        j                  | j                        j                         }t	        j
                  dt        t        j                  d            5 }t        j                  | j                        j                         }| j                  t        |      t        |             t        t        |            D ]F  }| j                  ||   d       | j                  ||   d       | j                  ||   ||   d       H |j                  sJ 	 d d d        y # 1 sw Y   y xY w)Nz(psutil._psplatform.cext.proc_memory_infomsgr  r   i   r   )r=   r"  r  r1  r   r   OSErrorerrnoEPERMr<   rc   r|  r   r   r  )r?   mem_1funmem_2r}  s        r   ru  z.TestDualProcessImplementation.test_memory_info  s    txx(446ZZ6U3
 
	 NN488,88:ESZU43u:& F''a!4''a!4&&uQxq&EF :::
	 
	 
	s   B=D$$D-c                 ~   t        j                  | j                        j                         }t	        j
                  dt        t        j                  d            5 }| j                  t        j                  | j                        j                         |       |j                  sJ 	 d d d        y # 1 sw Y   y xY w)N"psutil._psplatform.cext.proc_timesr  r  )r=   r"  r  r0  r   r   r  r  r  r<   r  )r?   ctimer  s      r   r  z.TestDualProcessImplementation.test_create_time  s    txx(446ZZ0U3
 	 V^^DHH5AACUK:::	 	 	   AB33B<c                    t        j                  | j                        j                         }t	        j
                  dt        t        j                  d            5 }t        j                  | j                        j                         }|j                  sJ | j                  |j                  |j                  d       | j                  |j                  |j                  d       d d d        y # 1 sw Y   y xY w)Nr  r  r  g{Gz?r   )r=   r"  r  rd   r   r   r  r  r  r  r   usersystem)r?   cpu_times_1r  cpu_times_2s       r   test_cpu_timesz,TestDualProcessImplementation.test_cpu_times  s    nnTXX.88:ZZ0U3
 	  ..2<<>K:::""  +"2"2$ #  """"K$6$6d # 	 	 	s   BC22C;c                    t        j                  | j                        j                         }t	        j
                  dt        t        j                  d            5 }t        j                  | j                        j                         }t        t        |            D ]  }| j                  ||   ||   d        |j                  sJ 	 d d d        y # 1 sw Y   y xY w)Nz(psutil._psplatform.cext.proc_io_countersr  r  rC   r   )r=   r"  r  r  r   r   r  r  r  r|  rc   r   r  )r?   io_counters_1r  io_counters_2r}  s        r   r  z.TestDualProcessImplementation.test_io_counters  s    txx0<<>ZZ6U3
 		 "NN4884@@BM3}-. &&!!$mA&6a '  :::		 		 		s   A/CCc                 ~   t        j                  | j                        j                         }t	        j
                  dt        t        j                  d            5 }| j                  t        j                  | j                        j                         |       |j                  sJ 	 d d d        y # 1 sw Y   y xY w)Nz(psutil._psplatform.cext.proc_num_handlesr  r  )r=   r"  r  r@  r   r   r  r  r  r<   r  )r?   r@  r  s      r   r  z.TestDualProcessImplementation.test_num_handles  s    nnTXX.::<ZZ6U3
 	 txx(446 :::	 	 	r  c                 P   t        j                         D ]C  }	 t        j                  |d      }t        j                  |d      }| j	                  ||       E y # t
        $ r@}t        |      }t        |t         j                  t         j                  f      s Y d }~d }~ww xY w)NT)use_pebF)
r=   r   r   proc_cmdliner<   r  r   
isinstancer$  rN  )r?   r  aberrs        r   r[  z*TestDualProcessImplementation.test_cmdline  s    ;;= 	'C
'%%c4%8%%c5%9   A&	'  %c*!&--v/C/CD s   .A	B%%6B  B%N)r   r   r   r  r  r  r  ru  r  r  r  r  r[  r   r   r   r  r    sM     ' '  	'r   r  c                   h     e Zd ZdZed        ZddgZ fdZ fdZd Z	d Z
d	 Zd
 Zd Zd Z xZS )RemoteProcessTestCasezCertain functions require calling ReadProcessMemory.
    This trivially works when called on the current process.
    Check that this works on other processes, especially when they
    have a different bitness.
    c                     d} t        j                   d      D ]s  }t        j                  |d| gt        j                  t        j                        }|j                         \  }}|j                          |t        t               k(  sq|c S  y )Nz6import sys; sys.stdout.write(str(sys.maxsize > 2**32))zC:\Python*\python.exe-c)argsstdoutstderr)	glob
subprocessPopenPIPESTDOUTcommunicaterM  r.  r
   )codefilenamerP   outputr  s        r   find_other_interpreterz,RemoteProcessTestCase.find_other_interpreter  s     H 		":; 		 H##d+!!((D
 ((*IFAIIK\**		 r   r  zimport sys; sys.stdin.read()c                 z   t               j                          | j                         }|t        j                  d      t
        rt        j                  | _        || _	        n|| _        t        j                  | _	        t        j                  j                         }t        t        j                               |d<   | j                  | j                  g| j                   z   |t"        j$                        | _        | j                  | j                  g| j                   z   |t"        j$                        | _        y )Nz0could not find interpreter with opposite bitnessTHINK_OF_A_NUMBER)envstdin)r   setUpr  r    r!   r
   sys
executablepython64python32r:   r;   copyr.  r?  r   	test_argsr  r  proc32proc64)r?   other_pythonr  	__class__s      r   r  zRemoteProcessTestCase.setUp#  s    224##B  NNDM(DM(DMNNDMjjoo#&ryy{#3 ))]]Odnn,#Z__ * 
 ))]]Odnn,#Z__ * 
r   c                     t               j                          | j                  j                          | j                  j                          y rL   )r   tearDownr  r  r  )r?   r  s    r   r  zRemoteProcessTestCase.tearDown;  s1    !!r   c                    t        j                  | j                  j                        }| j	                  t        |j                               d       | j	                  |j                         dd  | j                         y N   r'   )r=   r"  r  r  r<   rc   r#   r
  r&  s     r   test_cmdline_32z%RemoteProcessTestCase.test_cmdline_32@  S    NN4;;??+QYY[)1-QR$..9r   c                    t        j                  | j                  j                        }| j	                  t        |j                               d       | j	                  |j                         dd  | j                         y r  )r=   r"  r  r  r<   rc   r#   r
  r&  s     r   test_cmdline_64z%RemoteProcessTestCase.test_cmdline_64E  r  r   c                     t        j                  | j                  j                        }| j	                  |j                         t        j                                y rL   )r=   r"  r  r  r<   r  r:   getcwdr&  s     r   test_cwd_32z!RemoteProcessTestCase.test_cwd_32J  4    NN4;;??+"))+.r   c                     t        j                  | j                  j                        }| j	                  |j                         t        j                                y rL   )r=   r"  r  r  r<   r  r:   r  r&  s     r   test_cwd_64z!RemoteProcessTestCase.test_cwd_64N  r  r   c                     t        j                  | j                  j                        }|j	                         }| j                  d|       | j                  |d   t        t        j                                      y )Nr  )
r=   r"  r  r  r;   assertInr<   r.  r:   r?  )r?   r'  es      r   test_environ_32z%RemoteProcessTestCase.test_environ_32R  sS    NN4;;??+IIK)1-./RYY[1ABr   c                     t        j                  | j                  j                        }	 |j	                          y # t         j
                  $ r Y y w xY wrL   )r=   r"  r  r  r;   r$  r&  s     r   test_environ_64z%RemoteProcessTestCase.test_environ_64X  s>    NN4;;??+	IIK"" 		s   < AA)r   r   r   r  staticmethodr  r
  r  r  r  r  r  r  r!  r#  __classcell__)r  s   @r   r  r    sR        " 56I
0"
:
:
//Cr   r  c                       e Zd Zd Zd Zy)TestServicesc                    t        g d      }t        g d      }t        g d      }t        j                         D ]  }|j                         }| j	                  |d   t
               | j                  |d   j                         d       | j	                  |d   t
               | j	                  |d   t
               | j                  |d   |       |d	   t        j                  |d	          | j	                  |d
   t
               | j	                  |d   t
               | j	                  |d   t
               | j                  |d   |       | j                  |d   |       | j	                  |d   t
               |j                         }|4t        j                  |      }| j                  |j                                t        j                  |j                               }| j                  ||        y )N)runningpausedstartpausecontinuestopstopped)	automaticmanualdisabled)r)  r*  start_pendingpause_pendingcontinue_pendingstop_pendingr/  r-  r&   display_namer/  statusr  binpath
start_typedescription)r   r=   win_service_iteras_dictassertIsInstancer.  assertNotEqualr)   r  r"  r  r   
is_runningwin_service_getr-  r<   )r?   valid_statusesvalid_start_typesservr2   r  r'  ss           r   test_win_service_iterz"TestServices.test_win_service_iterg  s    
    CD 
  ++- 	&D<<>D!!$v,4V 2 2 4b9!!$~"6<!!$z"2C8MM$x..9E{&tE{+!!$y/37!!$z"2C8!!$|"4c:MM$|,.?@MM$x..9!!$}"5s;((*CNN3'/&&tyy{3AT1%-	&r   c                 b   t         j                  j                  j                  }t         j                  j                  j                  }t        t        j                               j                         }| j                  t         j                        5 }t        j                  |dz          d d d        | j                  j                  j                  |dz          t        j                  |      }t        rddd|f}n|df}t        | }t        j                   d|      5  | j                  t         j                  |j"                         d d d        t        j                   d|      5  | j                  t         j                  |j$                         d d d        t        rddd|f}n|df}t        | }t        j                   d|      5  | j                  t         j&                  |j"                         d d d        t        j                   d|      5  | j                  t         j&                  |j$                         d d d        | j)                  |j                         t+        |             | j)                  |j-                         t+        |             | j)                  |j                         t/        |             | j)                  |j-                         t/        |             y # 1 sw Y   GxY w# 1 sw Y   xY w# 1 sw Y   vxY w# 1 sw Y    xY w# 1 sw Y   xY w)Nz???r   r  z/psutil._psplatform.cext.winservice_query_statusr  z/psutil._psplatform.cext.winservice_query_config)r=   r  r   ERROR_SERVICE_DOES_NOT_EXISTERROR_ACCESS_DENIEDnextr<  r-  r#  rN  rA  r<   	exceptionr   r  r   r   r8  r/  r$  r  r.  r7  r   )r?   rH  rI  r-  cmservicer  r  s           r   test_win_service_getz!TestServices.test_win_service_get  s   ##@@ 	% %0055IIF++-.335v334 	1""4%<0	1**D5L9 ((.ua!=>D0%8DD!ZZ=3
 	D f22GNNC	D ZZ=3
 	F f22G4D4DE	F ua!45D'/DD!ZZ=3
 	C f117>>B	C ZZ=3
 	E f1173C3CD	E 	gllnc'l3g**,c'l;gllnd7m4g**,d7m<O	1 	1	D 	D	F 	F	C 	C	E 	Es<   K1"+K>,+L+L+L%1K;>LLL"%L.N)r   r   r   rF  rN  r   r   r   r'  r'  e  s    *&X.=r   r'  __main__)run_from_name)=r  r   r  r  r:   r3  rX  r;  r  r  r  r    warningsr=   r   psutil._compatr   r   r   psutil.testsr   r   r	   r
   r   r   r   r   r   r   r   r   r   r   catch_warningssimplefilterrD   rB  r^  rT   psutil._pswindowsr   r  r   ro   r   r$   r9   r4   r6   rq   r   r  r  r  r  r'  r   psutil.tests.runnerrP  __file__r   r   r   <module>rY     s#       	  	   
      ,     ! ' $ !   - * '  )  ' " 4	 	 	 	" h' 1  Wn-67+G-MN	n 	 O 8 .	  # ,'D/ 'DTc6_ c6V? ?NZ:/ Z:z@5_ @5L Wn-\'N \' .\'~ Wn-UN U .Uz Wn-[=> [= .[=| z1( o s   8#HH