o
    bi                     @   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	m
Z
mZmZ ddlmZ ddlmZ ddlZddlm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ejjd2k oejjdd d3kpejjd d4k d5dejjd6ej.v d7dG d8d9 d9Z/ejjejjd:k d;dejjd6ej.v d7dej0d<g d=d>d? Z1d@dA Z2dS )Bz`
    File object test module.

    Tests all aspects of File objects, including their creation.
    N   )utTestCaseUNICODE_FILENAMESclosed_tempfile)
direct_vfd)File   )h5c                   @   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$   H/home/ubuntu/.local/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_create@   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_exclusiveK   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_appendT   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 r1   r'   N)r   r   r(   r   r   r   r   r   r   PermissionErrorr   r+   r$   r$   r%   test_append_permissionsh   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_readonlyy   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+r2   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-   r0   r3   r   markskipifr   getenvsysplatformr:   r=   r?   rA   rC   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_thresholdr1   )rQ   Ninvalidr'   )rP   uint8)dtyper   .r2   r   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)rD   rE   rF   rG   r_   r$   r$   r$   r%   rN          rN   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   rO    @  )r   rQ   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   rO   )r   rQ   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.3r7   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   rO   r   rQ   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   rO   rw   Nr   rP   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   r	   r   rO   rw   Nr   r   rd   r   rm   )r!   r"   ry   rp   r#   rs   r$   r$   r%   test_actual_pbs  s   
"z!TestPageBuffering.test_actual_pbsN)rD   rE   rF   rG   rh   rt   r   rH   rI   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)rD   rE   rF   rG   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driverr1   Nr   r   r   r   r   r)   r!   r,   r$   r$   r%   
test_stdioD     

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   r1   r   r   rv   r	      )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_directR  s<   

zTestDrivers.test_directz!Sec2 driver is supported on posixc                 C   r   )z# Sec2 driver is supported on posix r   sec2r   r1   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_storer1   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   r2   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)rD   rE   rF   rG   r   
skipUnlessr   namer   r   r   r   r   r   r=   r   r   r   r$   r$   r$   r%   r   =  s     

/

r   zNot HDF5 release versionr7   c                       sp   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dd Zdd Z  ZS )TestNewLibverze
        Feature: File format compatibility bounds can be specified when
        opening a file.
    c                    s@   t    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v114)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  s   zTestNewLibver.test_single_v112c                 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)rD   rE   rF   rG   classmethodr   r&   r   r   r   r   skipIfr   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_only=  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   r1   r   N)r   r   r)   r   r<   r   r   r   r$   r$   r%   test_match_existingI  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_twoX  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_blocke  s    


zTestUserblock.test_write_blockN)	rD   rE   rF   rG   r   r   r   r   r   r$   r$   r$   r%   r      s    r   c                   @   rM   )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)rD   rE   rF   rG   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)rD   rE   rF   rG   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)rD   rE   rF   rG   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)rD   rE   rF   rG   r	  r  r  r$   r$   r$   r%   r    s
    r  c                   @   rM   )	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)rD   rE   rF   rG   r  r$   r$   r$   r%   r    r`   r  c                   @   rM   )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)rD   rE   rF   rG   r  r$   r$   r$   r%   r    r`   r  c                   @   rM   )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)rD   rE   rF   rG   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_handle;  s"   z7TestCloseInvalidatesOpenObjectIDs.test_close_one_handleN)rD   rE   rF   rG   r	  r  r$   r$   r$   r%   r  %  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_fileV  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_match]  s   
"z*TestPathlibSupport.test_pathlib_name_matchN)rD   rE   rF   rG   r   r%  r$   r$   r$   r%   r  Q  s    r  c                   @   rM   )
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_errorj  s   "zTestPickle.test_dump_errorN)rD   rE   rF   rG   r)  r$   r$   r$   r%   r&  h  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mpi4pyr.  r   
COMM_WORLDr   r!   mpi_file_namer.  r#   r$   r$   r%   	test_mpiot  
   "zTestMPI.test_mpioc                 C   r+  )z& Testing creation of file with append r   r-  r1   r/  r0  Nr2  r5  r$   r$   r%   test_mpio_append|  r8  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   r-  r   r/  r0  TN)r3  r.  r   r4  atomicr5  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 )r,  r   r-  r   r/  r0  r  N)r3  r.  r   r4  r(   r)   r5  r$   r$   r%   test_close_multiple_mpio_driver  s
   
z'TestMPI.test_close_multiple_mpio_driverN)rD   rE   rF   r7  r9  r;  r<  r$   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(   r>  r   r)   r?  r$   r$   r%   test_swmr_mode_consistency  s   
""z'TestSWMRMode.test_swmr_mode_consistencyN)rD   rE   rF   rG   rA  rB  r$   r$   r$   r%   r=    s    r=  )r      r   )r   
      z+Requires HDF5 >= 1.12.1 or 1.10.x >= 1.10.7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 valuerH  r   zunsupported-valuerI  N)r   r   r<   r   r   )r!   rL  r"   rM  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 processesrH  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runrK   
executable
returncodestderr)r   r   rJ  h5py_import_dirprocessr$   r$   r%   open_in_subprocess  s"   
z=TestFileLocking.test_multiprocess.<locals>.open_in_subprocessr   TrI  r   dataNr   F)r   r   )r!   rL  r"   rZ  r#   r$   r$   r%   test_multiprocess  s   
"z!TestFileLocking.test_multiprocessN)rD   rE   rF   rG   rN  rO  r\  r$   r$   r$   r%   rG    s
    rG  r{   r}   zlocking_arg,file_locking_props))F)r   r   )T)r   r   )rK  )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   )rJ  )r   r   r   rY   rn   get_file_lockingr   )	rL  locking_argfile_locking_props
fname_mainfname_elinkr#   locking_infoelink_datasetelink_locking_infor$   r$   r%   test_file_locking_external_link  s   
"rf  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 )NrP   rD  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_gc   s   
rp  )3rG   r   r   r   r'  r   rS  rK   commonr   r   r   r   h5py._hl.filesr   r   r    r
   r  r   rN   rH   mpi_skipra   r   r   rI   r   r   r   r   r   r   r   r  r  r  r  r  r  r  r&  mpir*  r=  environrG  parametrizerf  rp  r$   r$   r$   r%   <module>   s   	&L+  @`(',
$$A
