o
    IXhX                     @   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yH   dZY nw e dd
 Ze dkrXdndZedk r`d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 dS )5    N)import_helper)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   :/opt/python-3.10.19/usr/lib/python3.10/test/test_winreg.pysetUp6   s   zBaseWinregTests.setUpc                 C   sp   z	t ||dt}W n
 ty   Y d S w 	 zt|d}W n	 ty%   Y nw | || 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|| qt|\}	}
}| |	dd | |
dd t|\}	}
}| |	dd | |
t	td t
|}t| zt| | d W n	 tyq   Y nw t
|}|  zt| | d W d S  ty   Y d S w )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   s<   

z BaseWinregTests._write_test_datac              	   C   s4  t |t}| |dd ||t}|||P}d}	 zt||}W n	 ty*   Y nw | |tv dd |d }q| |ttd tD ]\}	}
}t||	\}}| ||
d | ||d qDW d    n1 siw   Y  |  t	|d}| ||d	 zt	|d | 
d
 W n	 ty   Y nw |  d S )Nr%   z+Registry didn't give back the correct valuer   r   Tz&Didn't read back the correct test dataz'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_datat   sR   



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
yN   Y nw |  t|t zt |t}| 	d W d S  t
yo   Y d S w )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 sw   Y  t||dtd}| |jdk W d    d S 1 s<w   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$   )__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!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      t | |dtS r   )rH   r   r5   r$   r   r   r   <lambda>       zILocalWinregTests.test_registry_works_extended_functions.<locals>.<lambda>)r4   c                 S   rP   r   )rI   KEY_READrQ   r   r   r   rR      rS   )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)rW   r   r   r   r   r   rR      s   
 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   sX   zt d t
}| |jd t1 sw   Y  W d S  ty+   | |jd Y d S w r   )rW   rX   rY   r)   r   r-   rZ   r   r   r   test_context_manager   s   z%LocalWinregTests.test_context_managerc           
   
      s  d G  fdddt j}| }|  zbtttd )}tdD ]}t|\}}}t|D ]}t||}	t	||	d  q.q!W d    n1 sHw   Y  W d |
  tttd  ttt d S W d |
  tttd  ttt d S d |
  tttd  ttt w )NFc                       s   e Zd Z fddZdS )z>LocalWinregTests.test_changing_value.<locals>.VeryActiveThreadc                    sp   t tt)}d}d} s&|rdn|}| }t|dt|  rW d    d S W d    d S 1 s1w   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   rj   r   rh   r   r   VeryActiveThread   s    rk   z\changing_valuei  r   T)	threadingThreadstartr4   r   r   ranger,   r>   r=   joinr!   )
r   rk   threadr5   _num_subkeys
num_valuestinamer   rh   r   test_changing_value   s<   

z$LocalWinregTests.test_changing_valuec                 C   s   d}zLt tt}t||td t|\}}}t|d W d    n1 s&w   Y  W ttdt|f ttt d S W ttdt|f ttt d S ttdt|f ttt w )NA   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxr   r   \)	r4   r   r   r&   r'   r,   r   r!   rp   )r   rw   r5   rs   rt   ru   r   r   r   test_long_key  s   zLocalWinregTests.test_long_keyc              
   C   sT   zt td W n ty" } z|jtjtjfv r| d  d }~ww 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   sH  zt tt}| |jd W d    n1 sw   Y  ttt}| |jd | t t| W d    n1 s=w   Y  | t t	| W d    n1 sVw   Y  | t t
| W d    n1 sow   Y  | t ttt W d    n1 sw   Y  W ttt d S W ttt d S ttt w r   )r4   r   r   rY   r)   r   r]   NotImplementedErrorDisableReflectionKeyEnableReflectionKeyQueryReflectionKeyDeleteKeyExr!   )r   ckr5   r   r   r   test_reflection_unsupported6  s*   



z,LocalWinregTests.test_reflection_unsupportedc              	   C   sv   z4t tt}| |jd t|dd td W d    n1 s w   Y  W ttt d S W ttt d S ttt w )Nr   	test_name        )r4   r   r   rY   r)   r+   	REG_DWORDr!   r   r   r   r   r   test_setvalueex_value_rangeJ  s   z,LocalWinregTests.test_setvalueex_value_rangec              	   C   s   zZt tt=}| t t|dd td t|dd td W d    n1 s'w   Y  | tt	|d | tt	|d W d    n1 sFw   Y  W t
tt d S W t
tt d S t
tt w )NZtest_name_dwordZtest_name_qword)r4   r   r   r]   OverflowErrorr+   r   	REG_QWORDFileNotFoundErrorr?   r!   r   r   r   r   "test_setvalueex_negative_one_checkV  s   z3LocalWinregTests.test_setvalueex_negative_one_checkc              	   C   s   zIt tt,}| |jd d}t|dd t| t|d\}}| |t | || W d    n1 s5w   Y  W t	tt d S W t	tt d S t	tt w )Nr   r   r   )
r4   r   r   rY   r)   r+   r   r?   r-   r!   r   r   Ztest_valZret_valZret_typer   r   r   test_queryvalueex_return_valueg  s   z/LocalWinregTests.test_queryvalueex_return_valuec              	   C   s   zIt tt,}| |jd d }t|ddt| t|d\}}| |t | || W d    n1 s5w   Y  W t	tt d S W t	tt d S t	tt w )Nr   r   )
r4   r   r   rY   r)   r+   
REG_BINARYr?   r-   r!   r   r   r   r   #test_setvalueex_crash_with_none_argw     z4LocalWinregTests.test_setvalueex_crash_with_none_argc              	   C   s   zIt tt,}| |jd d}t|ddt| t|d\}}| |t | |d W d    n1 s5w   Y  W t	tt d S W t	tt d S t	tt w )Nr   zA string  with a nullr   zA string)
r4   r   r   rY   r)   r+   r'   r?   r-   r!   r   r   r   r    test_read_string_containing_null  r   z1LocalWinregTests.test_read_string_containing_nullN)rK   rL   rM   rO   rU   rV   r\   r_   re   rf   rx   rz   r~   unittest
skipUnlessWIN_VERr   r   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   )rW   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   rV     s   
z%Win64WinregTests.test_named_arguments)ZWindowsCoreHeadlessZ	IoTEdgeOSz)APIs not available on WindowsCoreHeadlessc                 C   sh   t td%}| t| | t| | t| | t| W d    d S 1 s-w   Y  d S )NZSoftware)r   rX   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   s  zt ttdttB A}| |jd tttdttB }| |jd W d    n1 s-w   Y  t|ddt	d dd }| 
t| W d    n1 sNw   Y  tttdttB  }| |jd | dt|d t|ddt	d W d    n1 sw   Y  tttdttB }| dt|d W d    n1 sw   Y  W ttttd d S W ttttd d S ttttd w )Nr   r   Z32KEYc                   S      t ttdttB S r   )r   r   test_reflect_key_namerT   KEY_WOW64_64KEYr   r   r   r   rR         z2Win64WinregTests.test_reflection.<locals>.<lambda>Z64KEY)rH   r   r   r   KEY_WOW64_32KEYrY   r)   r   r+   r'   r]   r   r   r-   r=   rT   r   )r   created_keyr5   	open_failr   r   r   test_reflection  sN   
z Win64WinregTests.test_reflectionc                 C   s   zst ttdttB $}t|}| t|t | 	| t
| | t| W d    n1 s1w   Y  dd }| t| tttdttB }| |jd W d    n1 s[w   Y  W ttttd d S W ttttd d S ttttd w )Nr   c                   S   r   r   )rI   r   r   rT   r   r   r   r   r   rR     r   z:Win64WinregTests.test_disable_reflection.<locals>.<lambda>)rH   r   r   r   r   r   r-   r`   boolZassertFalser   r(   r]   r   rI   rT   rY   r)   r   )r   r   disabledr   r5   r   r   r   test_disable_reflection  s8   
z(Win64WinregTests.test_disable_reflectionc                 C   s:   |  t}ttd W d    d S 1 sw   Y  d S )NZsome_value_that_does_not_exist)r]   r   r=   ZHKEY_CLASSES_ROOT)r   ctxr   r   r   test_exception_numbers  s   "z'Win64WinregTests.test_exception_numbersN)rK   rL   rM   rV   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'))rb   sysr{   r   Ztest.supportr   rl   platformr   r   import_moduler   argvrA   r   
IndexError
ValueErrorZgetwindowsversionr   ZWIN64_MACHINEr   getpidZtest_key_baser   r   r   r   r'   ZREG_EXPAND_SZZREG_MULTI_SZr   r*   ZTestCaser   rN   r   r   r   rK   printmainr   r   r   r   <module>   sX     
J
b