a
    zeU                     @   s  d dl Z d dlZd dlZd dlZd dlmZ d dlZd dlmZm	Z	 ej
ddgd d dlT zejejdd	  ZW n eefy   dZY n0 e dd
 Ze dkrdndZedk rdndZde  f Zde Zde Zddefddefddefddefdg defdg defddefd d!d" efd#d$d% efd&d'efg
ZG d(d) d)ej Z!G d*d+ d+e!Z"e#ed,G d-d. d.e!Z$e#ed/G d0d1 d1e!Z%e&d2krese'd3d4 e(  dS )5    N)support)machinewin32_editionwinregwin)Zrequired_on)*z--remote      ZAMD64TF)   r   z Python Test Key [%d] - Delete Mez	SOFTWARE\zSOFTWARE\Classes\z	Int Value-   zQword Valuel   w*M	 z
String ValzA string valueZStringExpandzThe path is %path%zMulti-string)ZLotsZofstringvaluesz	Multi-nul) r   r   r   zRaw Datas   binary dataz
Big Stringxi?  z
Big Binary   xi @  u   Japanese 日本u	   日本語c                   @   sT   e Zd Zdd Zdd ZdefddZdefdd	Zdd
dZ	dddZ
dd ZdS )BaseWinregTestsc                 C   s   |  tt d S N)delete_treeHKEY_CURRENT_USERtest_key_nameself r   &/usr/lib/python3.9/test/test_winreg.pysetUp6   s    zBaseWinregTests.setUpc                 C   sr   zt ||dt}W n ty&   Y d S 0 zt|d}W n tyL   Y q\Y n0 | || q(t| t|| d S Nr   )OpenKeyKEY_ALL_ACCESSOSErrorEnumKeyr   CloseKey	DeleteKey)r   rootZsubkeyhkeyZ	subsubkeyr   r   r   r   ;   s    
zBaseWinregTests.delete_treesub_keyc                 C   s$  t |ttd ||t}| |jdk |||}tD ]\}}}t||d|| q6t|\}	}
}| |	dd | |
dd t|\}	}
}| |	dd | |
t	td t
|}t| zt| | d W n ty   Y n0 t
|}|  zt| | d W n ty   Y n0 d S )NDefault valuer   r   z"Not the correct number of sub keysz Not the correct number of valueszAIt appears the CloseKey() function does not close the actual key!zBIt appears the key.Close() function does not close the actual key!)SetValuer   REG_SZ
assertTruehandle	test_data
SetValueExQueryInfoKeyassertEquallenintr    failr   Close)r   root_key	subkeystr	CreateKeykeyr$   
value_name
value_data
value_typenkeysnvalues	since_modZint_sub_keyZint_keyr   r   r   _write_test_dataK   s8    

z BaseWinregTests._write_test_datac              	   C   s8  t |t}| |dd ||t}|||}d}zt||}W n tyV   Y qtY n0 | |tv dd |d }q2| |ttd tD ]4\}	}
}t||	\}}| ||
d | ||d qW d    n1 s0    Y  |  t	|d}| ||d	 zt	|d | 
d
 W n ty*   Y n0 |  d S )Nr%   z+Registry didn't give back the correct valuer   Tz&Didn't read back the correct test datar   z'Didn't read the correct number of itemsz!Could not directly read the valuezRead subkey value wrongz2Was able to get a second key when I only have one!)
QueryValuer   r-   	EnumValuer   r*   r.   QueryValueExr1   r   r0   )r   r2   r3   r   valr5   r$   indexdatar6   r7   r8   Zread_valZread_typr   r   r   _read_test_datau   sF    



$

zBaseWinregTests._read_test_datac                 C   s   t |tdt}t ||dt}tD ]\}}}t|| q t|\}}	}
| |dd | |	dd |  t|| zt|| | 	d W n t
y   Y n0 |  t|t zt |t}| 	d W n t
y   Y n0 d S )Nr   zsubkey not empty before deletez Deleting the key twice succeededzCould open the non-existent key)r   r   r   r*   ZDeleteValuer,   r-   r1   r!   r0   r   )r   r2   r3   r5   r$   r6   r7   r8   r9   r:   r;   r   r   r   _delete_test_data   s*    



z!BaseWinregTests._delete_test_datac                 C   s(   |  || | || | || d S r   )r<   rC   rD   )r   r2   r3   r   r   r   	_test_all   s    zBaseWinregTests._test_allc                 C   s   t ||dtd }| |jdk W d    n1 s60    Y  t||dtd }| |jdk W d    n1 sv0    Y  d S )Nr   )r5   r$   reservedaccess)CreateKeyExr   r(   r)   	OpenKeyEx)r   r5   r$   ZckeyZokeyr   r   r   _test_named_args   s    .z BaseWinregTests._test_named_argsN)r$   )r$   )__name__
__module____qualname__r   r   r4   r<   r   rC   rD   rE   rJ   r   r   r   r   r   4   s   
*(

r   c                   @   s   e Z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dd Zeedk ddd Zdd Zdd Zdd Zdd  Zd!S )"LocalWinregTestsc                 C   s   |  t |  td d S )Nu   日本-subkey)rE   r   r   r   r   r   test_registry_works   s    
z$LocalWinregTests.test_registry_worksc                 C   s:   dd }| j t|d dd }| jt|d | t d S )Nc                 S   s   t | |dtS r   )rH   r   r5   r$   r   r   r   <lambda>       zILocalWinregTests.test_registry_works_extended_functions.<locals>.<lambda>)r4   c                 S   s   t | |dtS r   )rI   KEY_READrP   r   r   r   rQ      rR   )r   )r<   r   rC   rD   )r   ZckeZoker   r   r   &test_registry_works_extended_functions   s
    z7LocalWinregTests.test_registry_works_extended_functionsc                 C   s   |  tt ttt d S r   )rJ   r   r   r!   r   r   r   r   test_named_arguments   s    z%LocalWinregTests.test_named_argumentsc                 C   s2   t d t}| |jd |  | |jd d S r   )ConnectRegistryHKEY_LOCAL_MACHINEassertNotEqualr)   r1   r-   r   hr   r   r   ,test_connect_registry_to_local_machine_works   s    
z=LocalWinregTests.test_connect_registry_to_local_machine_worksc                 C   s   dd }|  t| d S )Nc                   S   s
   t dtS )NZabcdefghijkl)rV   r   r   r   r   r   rQ      rR   zCLocalWinregTests.test_nonexistent_remote_registry.<locals>.<lambda>)assertRaisesr   )r   connectr   r   r    test_nonexistent_remote_registry   s    z1LocalWinregTests.test_nonexistent_remote_registryc                 C   s2   t d}| t|t | |tjd d  d S )Nz%windir%\testZwindirz\test)ZExpandEnvironmentStringsr-   typestrosenviron)r   rr   r   r   testExpandEnvironmentStrings   s    z-LocalWinregTests.testExpandEnvironmentStringsc                 C   sf   z@t d t"}| |jd tW d    n1 s40    Y  W n  ty`   | |jd Y n0 d S r   )rV   rW   rX   r)   r   r-   rY   r   r   r   test_context_manager   s    &z%LocalWinregTests.test_context_managerc           
   
      s   d G  fdddt j}| }|  ztttd R}tdD ]8}t|\}}}t|D ]}t||}	t	||	d  q\qBW d    n1 s0    Y  W d |
  tttd  ttt n&d |
  tttd  ttt 0 d S )NFc                       s   e Zd Z fddZdS )z>LocalWinregTests.test_changing_value.<locals>.VeryActiveThreadc                    s\   t tt>}d}d} s:|r dn|}| }t|dt| qW d    n1 sN0    Y  d S )NTA  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxr   Zchanging_value)r4   r   r   r&   r'   )r   r5   Z	use_shortZlong_stringsdoner   r   run  s    zBLocalWinregTests.test_changing_value.<locals>.VeryActiveThread.runN)rK   rL   rM   ri   r   rg   r   r   VeryActiveThread  s   rj   z\changing_valuei  r   T)	threadingThreadstartr4   r   r   ranger,   r>   r=   joinr!   )
r   rj   threadr5   _num_subkeys
num_valuestinamer   rg   r   test_changing_value   s,    

2z$LocalWinregTests.test_changing_valuec                 C   s   d}zrt tt6}t||td t|\}}}t|d W d    n1 sL0    Y  W ttdt|f ttt n ttdt|f ttt 0 d S )NA   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxr   r   \)	r4   r   r   r&   r'   r,   r   r!   ro   )r   rv   r5   rr   rs   rt   r   r   r   test_long_key  s    *zLocalWinregTests.test_long_keyc              
   C   s`   zt td W nB tyP } z*|jtjtjfv r:| d  W Y d }~n
d }~0 0 ttd d S )Nr   zMaccess denied to registry key (are you running in a non-interactive session?)r   )r>   ZHKEY_PERFORMANCE_DATAr   errnoEPERMZEACCESZskipTestr?   )r   er   r   r   test_dynamic_key)  s    
z!LocalWinregTests.test_dynamic_key)   r	   zRequires Windows XPc              	   C   s>  z*t tt}| |jd W d    n1 s20    Y  ttt}| |jd | t t| W d    n1 s|0    Y  | t t	| W d    n1 s0    Y  | t t
| W d    n1 s0    Y  | t ttt W d    n1 s0    Y  W ttt nttt 0 d S r   )r4   r   r   rX   r)   r   r\   NotImplementedErrorDisableReflectionKeyEnableReflectionKeyQueryReflectionKeyDeleteKeyExr!   )r   ckr5   r   r   r   test_reflection_unsupported7  s    ,
&&&,z,LocalWinregTests.test_reflection_unsupportedc              	   C   sh   zVt tt.}| |jd t|dd td W d    n1 s@0    Y  W ttt nttt 0 d S )Nr   	test_name        )r4   r   r   rX   r)   r+   	REG_DWORDr!   )r   r   r   r   r   test_setvalueex_value_rangeK  s
    0z,LocalWinregTests.test_setvalueex_value_rangec              	   C   s   zt ttX}| |jd d}t|dd t| t|d\}}| |t | || W d    n1 sj0    Y  W t	tt nt	tt 0 d S )Nr   r   r   )
r4   r   r   rX   r)   r+   r   r?   r-   r!   r   r   Ztest_valZret_valZret_typer   r   r   test_queryvalueex_return_valueW  s    ,z/LocalWinregTests.test_queryvalueex_return_valuec              	   C   s   zt ttX}| |jd d }t|ddt| t|d\}}| |t | || W d    n1 sj0    Y  W t	tt nt	tt 0 d S )Nr   r   )
r4   r   r   rX   r)   r+   
REG_BINARYr?   r-   r!   r   r   r   r   #test_setvalueex_crash_with_none_argg  s    ,z4LocalWinregTests.test_setvalueex_crash_with_none_argc              	   C   s   zt ttX}| |jd d}t|ddt| t|d\}}| |t | |d W d    n1 sj0    Y  W t	tt nt	tt 0 d S )Nr   zA string  with a nullr   zA string)
r4   r   r   rX   r)   r+   r'   r?   r-   r!   r   r   r   r    test_read_string_containing_nullt  s    ,z1LocalWinregTests.test_read_string_containing_nullN)rK   rL   rM   rO   rT   rU   r[   r^   rd   re   rw   ry   r}   unittest
skipUnlessWIN_VERr   r   r   r   r   r   r   r   r   rN      s    	 
rN   zSkipping remote registry testsc                   @   s   e Zd Zdd ZdS )RemoteWinregTestsc                 C   s   t tt}| | d S r   )rV   REMOTE_NAMEr   rE   )r   Z
remote_keyr   r   r   test_remote_registry_works  s    
z,RemoteWinregTests.test_remote_registry_worksN)rK   rL   rM   r   r   r   r   r   r     s   r   zx64 specific registry testsc                   @   s^   e Zd Zdd Zee dv ddd Zee	ddd	 Z
ee	dd
d Zdd ZdS )Win64WinregTestsc                 C   s    |  tt ttttdd d S )Nr   )r5   r$   rG   rF   )rJ   r   r   r   r   r   r   r   r   rU     s    z%Win64WinregTests.test_named_arguments)ZWindowsCoreHeadlessZ	IoTEdgeOSz)APIs not available on WindowsCoreHeadlessc                 C   sf   t tdH}| t| | t| | t| | t| W d    n1 sX0    Y  d S )NZSoftware)r   rW   r(   r   ZassertIsNoner   r   )r   r5   r   r   r   test_reflection_functions  s
    z*Win64WinregTests.test_reflection_functionszOS doesn't support reflectionc                 C   sx  z`t ttdttB }| |jd tttdttB }| |jd W d    n1 s\0    Y  t|ddt	d dd }| 
t| W d    n1 s0    Y  tttdttB @}| |jd | dt|d t|ddt	d W d    n1 s0    Y  tttdttB "}| dt|d W d    n1 sH0    Y  W ttttd nttttd 0 d S )Nr   r   Z32KEYc                   S   s   t ttdttB S r   )r   r   test_reflect_key_namerS   KEY_WOW64_64KEYr   r   r   r   rQ     s   z2Win64WinregTests.test_reflection.<locals>.<lambda>Z64KEY)rH   r   r   r   KEY_WOW64_32KEYrX   r)   r   r+   r'   r\   r   r   r-   r=   rS   r   )r   created_keyr5   	open_failr   r   r   test_reflection  s>    ,*04z Win64WinregTests.test_reflectionc                 C   s   zt ttdttB H}t|}| t|t | 	| t
| | t| W d    n1 sb0    Y  dd }| t| tttdttB }| |jd W d    n1 s0    Y  W ttttd nttttd 0 d S )Nr   c                   S   s   t ttdttB S r   )rI   r   r   rS   r   r   r   r   r   rQ     s   z:Win64WinregTests.test_disable_reflection.<locals>.<lambda>)rH   r   r   r   r   r   r-   r_   boolZassertFalser   r(   r\   r   rI   rS   rX   r)   r   )r   r   disabledr   r5   r   r   r   test_disable_reflection  s,    
,.z(Win64WinregTests.test_disable_reflectionc                 C   s8   |  t}ttd W d    n1 s*0    Y  d S )NZsome_value_that_does_not_exist)r\   FileNotFoundErrorr=   ZHKEY_CLASSES_ROOT)r   ctxr   r   r   test_exception_numbers  s    z'Win64WinregTests.test_exception_numbersN)rK   rL   rM   rU   r   ZskipIfr   r   r   HAS_REFLECTIONr   r   r   r   r   r   r   r     s   



+

r   __main__z)Remote registry calls can be tested usingz('test_winreg.py --remote \\machine_name'))ra   sysrz   r   testr   rk   platformr   r   import_moduler   argvrA   r   
IndexError
ValueErrorgetwindowsversionr   ZWIN64_MACHINEr   getpidZtest_key_baser   r   r   Z	REG_QWORDr'   ZREG_EXPAND_SZZREG_MULTI_SZr   r*   ZTestCaser   rN   r   r   r   rK   printmainr   r   r   r   <module>   sR   
  9

b
