o
    2hh                     @   s  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m	Z	 ddl
Z
ddlmZmZmZmZ ddlmZ ddlmZ ddlZddlZG dd	 d	eZG d
d deZe
jjG dd deZG dd deZG dd deZe
jjejjd d dkddG dd deZG dd deZ G dd deZ!e"e dG dd deZ#G dd deZ$G d d! d!eZ%G d"d# d#eZ&G d$d% d%eZ'G d&d' d'eZ(G d(d) d)eZ)G d*d+ d+eZ*G d,d- d-eZ+e
jj,G d.d/ d/Z-G d0d1 d1eZ.e
jjd2ej/v d3dG d4d5 d5Z0e
jjejjd6k d7de
jjd2ej/v d3de
j1d8g d9d:d; Z2d<d= Z3e
jj4d>d? Z5dS )@z`
    File object test module.

    Tests all aspects of File objects, including their creation.
    N)sha256   )utTestCaseUNICODE_FILENAMESclosed_tempfile)
direct_vfd)Filec                   @   s|   e Zd ZdZdd Zdd Zdd Zdd	 Zej	j
ed
dko$ejdkdddd Zdd Zdd Zdd Zdd ZdS )TestFileOpenz=
        Feature: Opening files with Python-style modes.
    c              
   C   sb  |   }tt t| W d   n1 sw   Y  W d   n1 s(w   Y  t|d W d   n1 s=w   Y  t|tj z)t|}| 	| | 
|jd W d   n1 sew   Y  W t|tj nt|tj w t|d}|d W d   n1 sw   Y  | t t| W d   dS 1 sw   Y  dS )z8 Default semantics in the presence or absence of a file Nwrwb    )mktemppytestraisesFileNotFoundErrorr	   oschmodstatS_IREAD
assertTrueassertEqualmodeS_IWRITEopenwriteassertRaisesOSErrorselffnamef r#   O/var/www/html/chatgem/venv/lib/python3.10/site-packages/h5py/tests/test_file.pytest_default(   s0   


 
"zTestFileOpen.test_defaultc                 C   sP   |   }t|d}| | |d |  t|d}| d| |  dS )z' Mode 'w' opens file in overwrite mode r   fooN)r   r	   r   create_groupcloseassertNotInr    r!   fidr#   r#   r$   test_createB   s   



zTestFileOpen.test_createc                 C   s^   |   }t|d}| | |  | t t|d W d   dS 1 s(w   Y  dS )z( Mode 'w-' opens file in exclusive mode w-N)r   r	   r   r(   r   FileExistsErrorr*   r#   r#   r$   test_create_exclusiveM   s   

"z"TestFileOpen.test_create_exclusivec                 C   s   |   }t|d}z| | |d d|v sJ W |  n|  w t|d}zd|v s1J |d d|v s<J W |  dS |  w )zE Mode 'a' opens file in append/readwrite mode, creating if necessary ar&   barN)r   r	   r   r'   r(   r*   r#   r#   r$   test_appendV   s   




zTestFileOpen.test_appendCIBUILDWHEEL1linuxz7Linux docker cibuildwheel environment permissions issuereasonc                 C   s   |   }t|d}|d W d   n1 sw   Y  t|tj z4tt	 t|d W d   n1 s;w   Y  W t|tjtj
B  dS W t|tjtj
B  dS t|tjtj
B  w )z' Mode 'a' fails when file is read-only r0   r&   N)r   r	   r'   r   r   r   r   r   r   PermissionErrorr   r*   r#   r#   r$   test_append_permissionsj   s   .z$TestFileOpen.test_append_permissionsc                 C   sx   |   }t|d}|  | | t|d}| | | t |d W d   n1 s1w   Y  |  dS )z& Mode 'r' opens file in readonly mode r   r   r&   N)r   r	   r(   assertFalser   r   
ValueErrorr'   r*   r#   r#   r$   test_readonly{   s   



zTestFileOpen.test_readonlyc                 C   s\   |   }t|d}|d |  t|d}d|v sJ |d d|v s(J |  dS )z1 Mode 'r+' opens existing file in readwrite mode r   r&   r+r1   N)r   r	   r'   r(   r*   r#   r#   r$   test_readwrite   s   



zTestFileOpen.test_readwritec                 C   sv   |   }| t t|d W d   n1 sw   Y  | t t|d W d   dS 1 s4w   Y  dS )z( Modes 'r' and 'r+' do not create files r   Nr=   )r   r   r   r	   r    r!   r#   r#   r$   test_nonexistent_file   s   "z"TestFileOpen.test_nonexistent_filec                 C   s>   |  t t|  d W d   dS 1 sw   Y  dS )z  Invalid modes raise ValueError mongooseN)r   r;   r	   r   )r    r#   r#   r$   test_invalid_mode   s   "zTestFileOpen.test_invalid_modeN)__name__
__module____qualname____doc__r%   r,   r/   r2   r   markskipifr   getenvsysplatformr9   r<   r>   r@   rB   r#   r#   r#   r$   r
   "   s    	
r
   c                   @      e Zd ZdZdd ZdS )TestSpaceStrategyzE
        Feature: Create file with specified file space strategy
    c                 C   sF  |   }t|ddddd}| | | t t|ddd W d   n1 s)w   Y  | t t|   dd	d W d   n1 sGw   Y  |jd
ddd}d|d< |jdddd}d|d< |d
= |  t|d}|j }|	 }|d dksJ |d dksJ |d dksJ |jdddd}d|d< |  dS )z& Create file with file space strategy r   pageTd   )fs_strategy
fs_persistfs_thresholdr0   )rP   Ninvalidr&   )rO   uint8)dtyper   .r1   r      foo2)
r   r	   r   r   r;   create_datasetr(   idget_create_plistget_file_space_strategy)r    r!   r+   dsetplistfs_stratr#   r#   r$   test_create_with_space_strategy   s4   


z1TestSpaceStrategy.test_create_with_space_strategyN)rC   rD   rE   rF   r_   r#   r#   r#   r$   rM          rM   c                   @   s   e Zd ZdZdd Zdd Zejje	j
jdkddd	d
 Zejje	j
jdk dddd Zejje	j
jdk dddd Zdd ZdS )TestPageBufferingz)
        Feature: Use page buffering
    c                 C   s   |   }t|dddd W d   n1 sw   Y  | t t|ddd W d   n1 s3w   Y  | t t|dddd W d   n1 sPw   Y  | t t|dddd W d   dS 1 snw   Y  dS )	z;Allow page buffering only with fs_strategy="page".
        r   rN    @  )r   rP   page_buf_sizeNr   rc   fsm	aggregater   r	   r   r   r?   r#   r#   r$   test_only_with_page_strategy   s   "z.TestPageBuffering.test_only_with_page_strategyc                 C   sn   |   }d}d}d}t|dd|||d}|j }| | |||f W d   dS 1 s0w   Y  dS )zHVerify set page buffer size, and minimum meta and raw eviction criteria.rb      C   r   rN   )r   rP   rc   min_meta_keepmin_raw_keepNr   r	   rY   get_access_plistr   get_page_buffer_size)r    r!   pbsmmmrr"   faplr#   r#   r$   test_check_page_buf_size   s   
"z*TestPageBuffering.test_check_page_buf_size)r         zRequires HDF5 <= 1.14.3r6   c                 C   s~   |   }d}t|dd|d W d   n1 sw   Y  | t t|d|d d W d   dS 1 s8w   Y  dS )	z;Page buffer size must be greater than file space page size.rb   r   rN   r   rP   fs_page_sizeNr   r   rd   rg   )r    r!   fspr#   r#   r$   test_too_small_pbs   s   "z$TestPageBuffering.test_too_small_pbsr   ru      Requires HDF5 >= 1.14.4c                 C   s   |   }d}t|dd W d   n1 sw   Y  t|d|d}|j }| d dks3J W d   dS 1 s>w   Y  dS )z(Open non-PAGE file with page buffer set.rb   r   )r   Nr   rd   r   r   r	   rY   rn   ro   r    r!   ry   r"   rs   r#   r#   r$   test_open_nonpage_pbs   s   
"z'TestPageBuffering.test_open_nonpage_pbsc                 C   s   |   }d}t|dd|d W d   n1 sw   Y  t|d|d d}|j }| d	 |ks7J W d   dS 1 sBw   Y  dS )
zBAdjust page buffer size automatically when smaller than file page.rb   r   rN   rw   Nr   rO   rd   r   r~   r   r#   r#   r$   test_smaller_pbs   s   
"z"TestPageBuffering.test_smaller_pbsc                 C   s   |   }d}d| }t|dd|d W d   n1 sw   Y  t|d|d d	}|j }| | d
 | W d   dS 1 sFw   Y  dS )zVerify actual page buffer size.rb   rV   r   rN   rw   Nr   r   rd   r   rm   )r    r!   ry   rp   r"   rs   r#   r#   r$   test_actual_pbs  s   
"z!TestPageBuffering.test_actual_pbsN)rC   rD   rE   rF   rh   rt   r   rG   rH   h5pyversionhdf5_version_tuplerz   r   r   r   r#   r#   r#   r$   ra      s"    
	



ra   c                   @       e Zd ZdZdd Zdd ZdS )	TestModesz?
        Feature: File mode can be retrieved via file.mode
    c                 C   s~   |   }t|d}| |jd W d   n1 sw   Y  t|d}| |jd W d   dS 1 s8w   Y  dS )z/ Mode equivalent can be retrieved via property r   r=   Nr   )r   r	   r   r   r   r#   r#   r$   test_mode_attr  s   "zTestModes.test_mode_attrc                 C   s   |   }|   }t|d}|  t|d}zt|d|d< |d j}| |jd W |  |  n	|  |  w t|d}z|d j}| |jd W |  |  dS |  |  w )zU Mode property works for files opened via external links

        Issue 190.
        r   /Externalr=   r   N)r   r	   r(   r   ExternalLinkfiler   r   )r    fname1fname2f1f2f3r#   r#   r$   test_mode_external"  s*   







zTestModes.test_mode_externalN)rC   rD   rE   rF   r   r   r#   r#   r#   r$   r     s    r   c                   @   s   e Zd ZdZeejdkddd Zee	ddd Z
eejdkd	d
d Zdd Zdd Zdd Zdd Zdd Zdd ZdS )TestDriverszz
        Feature: Files can be opened with low-level HDF5 drivers. Does not
        include MPI drivers (see bottom).
    posixz"Stdio driver is supported on posixc                 C   h   t |  ddd}| | | |jd |  t |  ddd}| | | |jd |  dS )z$ Stdio driver is supported on posix r   stdiodriverr0   Nr	   r   r   r   r   r(   r    r+   r#   r#   r$   
test_stdioF     

zTestDrivers.test_stdiozODIRECT driver is supported on Linux if hdf5 is built with the appriorate flags.c           
   	   C   sZ  t |  ddd}| | | |jd |j  }|  t |  ddd}| | | |jd |  ||d |d d|d  f|d d |d d|d  f|d d|d  d	|d  ffD ]F\}}}t |  dd|||d
-}|j  }|d }|d }|d }	||ksJ ||ksJ |	|	ksJ W d   n1 sw   Y  qddS )z$ DIRECT driver is supported on Linuxr   directr   r0   r   r   rv   rV      )r   	alignment
block_size	cbuf_sizeN)	r	   r   r   r   r   rY   rn   get_fapl_directr(   )
r    r+   default_faplr   r   r   actual_faplactual_alignmentactual_block_sizeactual_cbuf_sizer#   r#   r$   test_directT  s<   

zTestDrivers.test_directz!Sec2 driver is supported on posixc                 C   r   )z# Sec2 driver is supported on posix r   sec2r   r0   Nr   r   r#   r#   r$   	test_sec2  r   zTestDrivers.test_sec2c                 C   s   |   }t|dddd}| | | |jd |  | tj	| t|   ddd}| | | |jd |  dS )z- Core driver is supported (no backing store) r   coreFr   backing_storer0   r   N)
r   r	   r   r   r   r(   r:   r   pathexistsr*   r#   r#   r$   	test_core  s   

zTestDrivers.test_corec                 C   s   |   }t|dddd}|d |  t|d}d|v s J |  | t t|ddd W d   dS 1 s<w   Y  dS )	z3 Core driver saves to file when backing store used r   r   Tr   r&   r   )r   N)r   r	   r'   r(   r   	TypeErrorr*   r#   r#   r$   test_backing  s   

"zTestDrivers.test_backingc                 C   s   |   }t|d}|d |  t|ddd}| | d|v s$J | t |d W d   n1 s9w   Y  |  dS )z0 Core driver can be used to open existing files r   r&   r   r   r   r1   N)r   r	   r'   r(   r   r   r;   r*   r#   r#   r$   r<     s   


zTestDrivers.test_readonlyc                 C   s0   |   }t|ddddd}| | |  dS )z* Core driver supports variable block size r   r      F)r   r   r   N)r   r	   r   r(   r*   r#   r#   r$   test_blocksize  s   

zTestDrivers.test_blocksizec                 C   sX   |   }t|ddd}|  | tj|d  t|ddd}| | |  dS )z* Split stores metadata in a separate file r   splitr   z-m.h5r   N)r   r	   r(   r   r   r   r   r*   r#   r#   r$   
test_split  s   
zTestDrivers.test_splitc                 C   sz   t  }t|ddd}| | | |jd |  | t t|ddd W d   n1 s2w   Y  |  dS )z( Python file object driver is supported r   fileobjr   r   N)	tempfileTemporaryFiler	   r   r   r   r(   r   r;   )r    tfr+   r#   r#   r$   test_fileobj  s   
zTestDrivers.test_fileobjN)rC   rD   rE   rF   r   
skipUnlessr   namer   r   r   r   r   r   r<   r   r   r   r#   r#   r#   r$   r   ?  s     

/

r   rV   zNot HDF5 release versionr6   c                       s   e Zd ZdZe fddZdd Zdd Zdd	 Zd
d Z	e
ejjdk ddd Ze
ejjdk ddd Ze
ejjdk ddd Zdd Zdd Z  ZS )TestNewLibverze
        Feature: File format compatibility bounds can be specified when
        opening a file.
    c                    sV   t    tjjdk rd| _d S tjjdk rd| _d S tjjdk r&d| _d S d| _d S )Nr      r|   v110)r      r   v112rV   r   r   v114v200)super
setUpClassr   r   r   latest)cls	__class__r#   r$   r     s   




zTestNewLibver.setUpClassc                 C   .   t |  d}| |jd| jf |  dS )z Opening with no libver arg r   earliestNr	   r   r   libverr   r(   r    r"   r#   r#   r$   r%        zTestNewLibver.test_defaultc                 C   s4   t |  ddd}| |j| j| jf |  dS )z  Opening with single libver arg r   r   r   Nr   r   r#   r#   r$   test_single  s   zTestNewLibver.test_singlec                 C   2   t |  ddd}| |jd| jf |  dS )z  Opening with "v108" libver arg r   v108r   Nr   r   r#   r#   r$   test_single_v108     zTestNewLibver.test_single_v108c                 C   r   )z  Opening with "v110" libver arg r   r   r   Nr   r   r#   r#   r$   test_single_v110	  r   zTestNewLibver.test_single_v110r   zRequires HDF5 1.11.4 or laterc                 C   r   )z  Opening with "v112" libver arg r   r   r   Nr   r   r#   r#   r$   test_single_v112     zTestNewLibver.test_single_v112)r   ru   r   zRequires HDF5 1.14 or laterc                 C   r   )z  Opening with "v114" libver arg r   r   r   Nr   r   r#   r#   r$   test_single_v114  r   zTestNewLibver.test_single_v114r   zRequires HDF5 2.0 or laterc                 C   r   )z  Opening with "v200" libver arg r   r   r   Nr   r   r#   r#   r$   test_single_v200  r   zTestNewLibver.test_single_v200c                 C   s,   t |  ddd}| |jd |  dS )z Opening with two libver args r   )r   r   r   N)r	   r   r   r   r(   r   r#   r#   r$   test_multiple'  s   zTestNewLibver.test_multiplec                 C   r   )z6 Omitting libver arg results in maximum compatibility r   r   Nr   r   r#   r#   r$   	test_none-  r   zTestNewLibver.test_none)rC   rD   rE   rF   classmethodr   r%   r   r   r   r   skipIfr   r   r   r   r   r   r   r   __classcell__r#   r#   r   r$   r     s,    


r   c                   @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )TestUserblockz;
        Feature: Files can be create with user blocks
    c                 C   s   t |  ddd}z| |jd W |  n|  w t |  ddd}z| |jd W |  n|  w t |  ddd}z| |jd W |  n|  w | t t |  ddd W d   dS 1 snw   Y  dS )zA User blocks created with w, w-, x and properties work correctly r-      userblock_sizexr   nonN)r	   r   r   r   r(   r   r;   r   r#   r#   r$   test_create_blocksize:  s   "z#TestUserblock.test_create_blocksizec                 C   s   |   }t|d}|  | t tj|ddd}W d   n1 s%w   Y  | t tj|ddd}W d   dS 1 sCw   Y  dS )z# User block only allowed for write r   r   r   r   Nr=   )r   r	   r(   r   r;   r   r    r   r"   r#   r#   r$   test_write_onlyQ  s   
"zTestUserblock.test_write_onlyc                 C   s   |   }t|ddd}|  | t t|ddd}W d   n1 s&w   Y  t|ddd}z| |jd W |  dS |  w )zA User block size must match that of file when opening for append r   r   r   r0   r   N)r   r	   r(   r   r;   r   r   r   r#   r#   r$   test_match_existing]  s   z!TestUserblock.test_match_existingc                 C   s   |   }| t t|ddd}W d   n1 sw   Y  | t t|ddd}W d   n1 s7w   Y  | t t|ddd}W d   dS 1 sTw   Y  dS )z7 User block size must be a power of 2 and at least 512 r      r   Ni  i  )r   r   r;   r	   r   r#   r#   r$   test_power_of_twol  s   "zTestUserblock.test_power_of_twoc                 C   s   |   }t|ddd}|d |  t|d}z|d W |  n|  w t|d}zd|v s7J W |  n|  w t|d}z| |dd W |  d	S |  w )
z= Test that writing to a user block does not destroy the file r   r   r   Foobarzr+bs   XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXr   rbN)	r   r	   r'   r(   r   r   r   r   read)r    r   r"   pyfiler#   r#   r$   test_write_blocky  s    


zTestUserblock.test_write_blockN)	rC   rD   rE   rF   r   r   r   r   r   r#   r#   r#   r$   r   4  s    r   c                   @   rL   )TestContextManagerzC
        Feature: File objects can be used as context managers
    c                 C   sH   t |  d}| | W d   n1 sw   Y  | |  dS )z- File objects can be used in with statements r   N)r	   r   r   r   r#   r#   r$   test_context_manager  s   z'TestContextManager.test_context_managerN)rC   rD   rE   rF   r   r#   r#   r#   r$   r     r`   r   z#Filesystem unicode support requiredc                   @   (   e Zd ZdZdd Zdd Zdd ZdS )	TestUnicodez6
        Feature: Unicode filenames are supported
    c                 C   sP   | j tdd}t|d}z| |j| | |jt W |  dS |  w )zM Unicode filenames can be used, and retrieved properly via .filename
           prefixr   N)r   chrr	   r   filenameassertIsInstancestrr(   r*   r#   r#   r$   test_unicode  s   
zTestUnicode.test_unicodec                 C   s   | j tdd}ttjj ddlm} td| td| t|d}tt	
| j W d   n1 s8w   Y  t	j|sEJ dS )	zG Unicode filenames can be used, and seen correctly from python
        r   r   r   )WINDOWS_ENCODINGzWindows file encoding in usez	Creating r   N)r   r   printr   r   infoh5py._hl.compatr   r	   r   listdirtempdirr   r   )r    r!   r   r"   r#   r#   r$   #test_unicode_hdf5_python_consistent  s   
z/TestUnicode.test_unicode_hdf5_python_consistentc                 C   s~   | j tdd}| t t|d W d   n1 sw   Y  | t t|d W d   dS 1 s8w   Y  dS )zV
        Modes 'r' and 'r+' do not create files even when given unicode names
        r   r   r   Nr=   )r   r   r   r   r	   r?   r#   r#   r$   test_nonexistent_file_unicode  s   "z)TestUnicode.test_nonexistent_file_unicodeN)rC   rD   rE   rF   r   r  r  r#   r#   r#   r$   r     s
    r   c                   @   r   )	TestFilePropertyzk
        Feature: A File object can be retrieved from any child object,
        via the .file property
    c                 C   sB   |   }t|d}z|d j}| || W |  dS |  w )z, File object can be retrieved from subgroup r   r   N)r   r	   r   r   r(   )r    r!   hfilehfile2r#   r#   r$   test_property  s   

zTestFileProperty.test_propertyc                 C   sV   |   }t|d}|d}|j}|d j}|  | | | | | | dS )z8 All retrieved File objects are closed at the same time r   r&   r   N)r   r	   r'   r   r(   r:   )r    r!   r	  grpr
  hfile3r#   r#   r$   
test_close  s   




zTestFileProperty.test_closec                 C   sD   t |  d}z|d}| |jj|j W |  dS |  w )z9 Retrieved File objects have a meaningful mode attribute r   r&   N)r	   r   r'   r   r   r   r(   )r    r	  r  r#   r#   r$   	test_mode  s
   
zTestFileProperty.test_modeN)rC   rD   rE   rF   r  r  r  r#   r#   r#   r$   r    s
    
r  c                   @   r   )		TestClosez*
        Feature: Files can be closed
    c                 C   s.   t |  d}| | |  | | dS )z Close file via .close method r   N)r	   r   r   r(   r:   r   r#   r#   r$   r    s   
zTestClose.test_closec                 C   sP   t |  d}|  | t |d W d   dS 1 s!w   Y  dS )z0 Trying to modify closed file raises ValueError r   r&   N)r	   r   r(   r   r;   r'   r   r#   r#   r$   test_closed_file  s
   "zTestClose.test_closed_filec                 C   s2   |   }t|d}|d |  |  d S )Nr   test)r   r   r	   r'   r(   r   r#   r#   r$   "test_close_multiple_default_driver  s
   
z,TestClose.test_close_multiple_default_driverN)rC   rD   rE   rF   r  r  r  r#   r#   r#   r$   r    s
    r  c                   @   rL   )	TestFlushz+
        Feature: Files can be flushed
    c                 C   s"   t |  d}|  |  dS )z Flush via .flush method r   N)r	   r   flushr(   r   r#   r#   r$   
test_flush  s   zTestFlush.test_flushN)rC   rD   rE   rF   r  r#   r#   r#   r$   r    r`   r  c                   @   rL   )TestReprzE
        Feature: File objects provide a helpful __repr__ string
    c                 C   s:   t |  d}| t|t |  | t|t dS )z8 __repr__ behaves itself when files are open and closed r   N)r	   r   r   reprr   r(   r   r#   r#   r$   	test_repr   s   zTestRepr.test_reprN)rC   rD   rE   rF   r  r#   r#   r#   r$   r    r`   r  c                   @   rL   )TestFilenamezO
        Feature: The name of a File object can be retrieved via .filename
    c                 C   sH   |   }t|d}z| |j| | |jt W |  dS |  w )z, .filename behaves properly for string data r   N)r   r	   r   r   r   r   r(   r*   r#   r#   r$   test_filename.  s   
zTestFilename.test_filenameN)rC   rD   rE   rF   r  r#   r#   r#   r$   r  (  r`   r  c                   @   r   )!TestCloseInvalidatesOpenObjectIDszO
        Ensure that closing a file invalidates object IDs, as appropriate
    c                 C   s   t |  d1}|d}| t|j | t|j |  | t|j | t|j W d   n1 s;w   Y  t |  d.}|d}| t|j | t|j | t|j | t|j W d   dS 1 sxw   Y  dS )z; Closing a file invalidates any of the file's open objects r   r&   N)r	   r   r'   r   boolrY   r(   r:   )r    r   g1r   g2r#   r#   r$   r  ?  s   

"z,TestCloseInvalidatesOpenObjectIDs.test_closec                 C   s   |   }t|d}|d W d    n1 sw   Y  t|}t|}|d }|d }|jjs4J |jjs:J |  |jjrDJ |jjsJJ |jjsPJ |  |jjrZJ |jjr`J d S )Nr   r&   )r   r	   r'   rY   validr(   )r    r!   r"   r   r   r  r  r#   r#   r$   test_close_one_handleO  s"   z7TestCloseInvalidatesOpenObjectIDs.test_close_one_handleN)rC   rD   rE   rF   r  r!  r#   r#   r#   r$   r  9  s    r  c                   @   r   )TestPathlibSupportz6
        Check that h5py doesn't break on pathlib
    c              	   C   sz   t  0}t|}t|d}| d W d   n1 sw   Y  W d   dS W d   dS 1 s6w   Y  dS )z- Check that pathlib is accepted by h5py.File r   TN)r   pathlibPathr	   r   )r    r"   r   r   r#   r#   r$   test_pathlib_accepted_filej  s   
"z-TestPathlibSupport.test_pathlib_accepted_filec              	   C   s   t  D}t|}t|d}|j}W d   n1 sw   Y  t|d}|j}W d   n1 s4w   Y  | || W d   dS 1 sJw   Y  dS )z1 Check that using pathlib does not affect naming r   N)r   r#  r$  r	   r   r   )r    r"   r   h5f1pathlib_nameh5f2normal_namer#   r#   r$   test_pathlib_name_matchq  s   
"z*TestPathlibSupport.test_pathlib_name_matchN)rC   rD   rE   rF   r%  r*  r#   r#   r#   r$   r"  e  s    r"  c                   @   rL   )
TestPicklez%Check that h5py.File can't be pickledc              	   C   sx   t |  d+}| t t| W d    n1 sw   Y  W d    d S W d    d S 1 s5w   Y  d S )Nr   )r	   r   r   r   pickledumps)r    r   r#   r#   r$   test_dump_error~  s   "zTestPickle.test_dump_errorN)rC   rD   rE   rF   r.  r#   r#   r#   r$   r+  |  s    r+  c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
TestMPIc                 C   Z   ddl m} t|dd|jd}|sJ |jdksJ W d   dS 1 s&w   Y  dS ) MPIO driver and options r   MPIr   mpior   commNmpi4pyr3  r	   
COMM_WORLDr   r    mpi_file_namer3  r"   r#   r#   r$   	test_mpio  
   "zTestMPI.test_mpioc                 C   r0  )z& Testing creation of file with append r   r2  r0   r4  r5  Nr7  r:  r#   r#   r$   test_mpio_append  r=  zTestMPI.test_mpio_appendc                 C   s^   ddl m} t|dd|jd}|jrJ d|_|jsJ W d   dS 1 s(w   Y  dS )z$ Enable atomic mode for MPIO driver r   r2  r   r4  r5  TN)r8  r3  r	   r9  atomicr:  r#   r#   r$   test_mpi_atomic  s   
"zTestMPI.test_mpi_atomicc                 C   s<   ddl m} t|dd|jd}|d |  |  dS )r1  r   r2  r   r4  r5  r  N)r8  r3  r	   r9  r'   r(   r:  r#   r#   r$   test_close_multiple_mpio_driver  s
   
z'TestMPI.test_close_multiple_mpio_driverN)rC   rD   rE   r<  r>  r@  rA  r#   r#   r#   r$   r/    s
    	r/  c                   @   r   )TestSWMRModez=
        Feature: Create file that switches on SWMR mode
    c                 C   sv   |   }t|ddd}|d}|j|jj  krdks!J  J d|_|j|jj  kr2dks5J  J |  d S )Nr   r   r   r&   r=   T)r   r	   r'   r   r   	swmr_moder(   r    r!   r+   gr#   r#   r$   test_file_mode_generalizes  s   
""z'TestSWMRMode.test_file_mode_generalizesc                 C   sv   |   }t|ddd}|d}|j|jj  krdks!J  J d|_|j|jj  kr2dks5J  J |  d S )Nr   r   r   r&   FT)r   r	   r'   rC  r   r(   rD  r#   r#   r$   test_swmr_mode_consistency  s   
""z'TestSWMRMode.test_swmr_mode_consistencyN)rC   rD   rE   rF   rF  rG  r#   r#   r#   r$   rB    s    rB  HDF5_USE_FILE_LOCKINGz&HDF5_USE_FILE_LOCKING env. var. is setc                   @   r   )	TestFileLockingz"Test h5py.File file locking optionc              
   C   s  |d }t j|ddd}|  tt  t j|ddd}W d   n1 s*w   Y  W d   n1 s9w   Y  t j|ddd}W d   n1 sQw   Y  t jjdk rut j|dd	d}W d   n1 sow   Y  n5tt  t j|dd	d}W d   n1 sw   Y  W d   n1 sw   Y  W d   dS W d   dS W d   dS 1 sw   Y  dS )
z2Test file locking when opening twice the same filetest.h5r   Tr   lockingr   FNr{   best-effort)r   r	   r  r   r   r   r   r   )r    tmp_pathr!   r"   h5f_readr#   r#   r$   test_reopen  s8    "zTestFileLocking.test_reopenc              	   C   sx   |d }t t) tj|ddd}W d   n1 sw   Y  W d   dS W d   dS 1 s5w   Y  dS )z&Test with erroneous file locking valuerJ  r   zunsupported-valuerK  N)r   r   r;   r   r	   )r    rN  r!   rO  r#   r#   r$   test_unsupported_locking  s   "z(TestFileLocking.test_unsupported_lockingc                 C   s   |d }dd }t j|ddd}d|d< W d	   n1 sw   Y  t j|d
dd}||ddds6J W d	   d	S 1 sAw   Y  d	S )z<Test file locking option from different concurrent processesrJ  c                 S   sZ   t ttjjj}tjtj	dd|dt | d|d| d	gdd}|j
d	ko,|j S )
z9Open HDF5 file in a subprocess and return True on successz-cz
import sys
sys.path.insert(0, z)
import h5py
f = h5py.File(z, mode=z
, locking=z)
                    T)capture_outputr   )r   r#  r$  r   __file__parent
subprocessrunrJ   
executable
returncodestderr)r   r   rL  h5py_import_dirprocessr#   r#   r$   open_in_subprocess  s"   
z=TestFileLocking.test_multiprocess.<locals>.open_in_subprocessr   TrK  r   dataNr   F)r   r	   )r    rN  r!   r\  r"   r#   r#   r$   test_multiprocess  s   
"z!TestFileLocking.test_multiprocessN)rC   rD   rE   rF   rP  rQ  r^  r#   r#   r#   r$   rI    s
    rI  r{   r}   zlocking_arg,file_locking_props))F)r   r   )T)r   r   )rM  )r   r   c           	      C   s   | d }| d }t |d}d|d< W d   n1 sw   Y  t |d}t |d|d< W d   n1 s;w   Y  t j|d	|d
(}|j  }||ksVJ |d }|jj  }||kshJ W d   dS 1 ssw   Y  dS )z5Test that same file locking is used for external linkztest_main.h5ztest_linked.h5r   r   r]  Nz/datalinkr   )rL  )r   r	   r   rY   rn   get_file_lockingr   )	rN  locking_argfile_locking_props
fname_mainfname_elinkr"   locking_infoelink_datasetelink_locking_infor#   r#   r$   test_file_locking_external_link  s   
"rh  c              	   C   s   t dD ]}g | t|< q| j}|   t dD ]'}t|d}dd | D }|| ~W d    n1 s:w   Y  qd S )NrO   
   r   c                 S   s   g | ]}|j qS r#   )rY   ).0dr#   r#   r$   
<listcomp>=  s    z!test_close_gc.<locals>.<listcomp>)ranger   r   r(   r   r	   valuesappend)writable_fileir   r"   refsr#   r#   r$   test_close_gc0  s   
rs  c                 C   sZ   dd }| d }|| t d | d }|| t|  t|  ks+J d S )Nc                 S   sR   t | ddd}|jddd}|jdddd W d    d S 1 s"w   Y  d S )	Nr   T)track_ordergroupr\   ri  f4)shaperU   )r	   r'   rX   )r   hfrE  r#   r#   r$   r   D  s   "z%test_reproducible_file.<locals>.writezf1.h5g?zf2.h5)timesleepr   
read_bytes	hexdigest)rN  r   r   r   r#   r#   r$   test_reproducible_fileB  s   
(r}  )6rF   r   r   r,  r   ry  rU  rJ   hashlibr   r   commonr   r   r   r   h5py._hl.filesr   r   r	   r#  r
   rM   rG   mpi_skipra   r   r   rH   r   r   r   r   r   r   r   r  r  r  r  r  r  r"  r+  mpir/  rB  environrI  parametrizerh  rs  slowr}  r#   r#   r#   r$   <module>   s|   	&L+  R`(',
$A
