o
    i e|                     @   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e	ejjdk dG dd de
Ze	ejjdk dejjG dd de
ZG dd de
ZG dd de
Ze	ejjdk dG dd de
Ze	ejjdk 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/d0 d0e
Z*G d1d2 d2e
Z+ejj,G d3d4 d4Z-e	ejjdk dG d5d6 d6e
Z.ejj/ejjd7k o@ejjdd d8kp@ejjd d9k d:d;ejj/d<ej0v d=d;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                   @   sP   e Zd 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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$   C/var/www/myenv/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 |  n|  w t|tj z4t	
t t|d W d   n1 sdw   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 )zE Mode 'a' opens file in append/readwrite mode, creating if necessary ar'   barN)r   r   r   r(   r)   r   r   r   r   r   r   PermissionErrorr   r+   r$   r$   r%   test_appendT   s*   




.zTestFileOpen.test_appendc                 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_readonlyn   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_readwritez   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   Nr8   )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   r6   r   r   )r!   r$   r$   r%   test_invalid_mode   s   "zTestFileOpen.test_invalid_modeN)__name__
__module____qualname____doc__r&   r-   r0   r4   r7   r9   r;   r=   r$   r$   r$   r%   r       s    	r   )r   
   r   zRequires HDF5 1.10.1 or laterc                   @      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   )rG   Ninvalidr'   )rF   uint8)dtyper   .r2   r   r	   foo2)
r   r   r   r   r6   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)r>   r?   r@   rA   rU   r$   r$   r$   r%   rD      s    rD   c                   @   0   e Zd ZdZdd Zdd Z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   rE    @  )r   rG   page_buf_sizeNr   rY   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.rX      C   r   rE   )r   rG   rY   min_meta_keepmin_raw_keepNr   r   rO   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_sizec                 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.rX   r   rE   r   rG   fs_page_sizeNr   r   rZ   r]   )r!   r"   fspr$   r$   r%   test_too_small_pbs   s   "z$TestPageBuffering.test_too_small_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.rX   r	   r   rE   rk   Nr   r   rZ   r   rc   )r!   r"   rm   rf   r#   ri   r$   r$   r%   test_actual_pbs   s   
"z!TestPageBuffering.test_actual_pbsN)r>   r?   r@   rA   r^   rj   rn   ro   r$   r$   r$   r%   rW      s    	rW   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   r8   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   /Externalr8   r   N)r   r   r)   h5pyExternalLinkfiler   r   )r!   fname1fname2f1f2f3r$   r$   r%   test_mode_external   s*   







zTestModes.test_mode_externalN)r>   r?   r@   rA   rr   r}   r$   r$   r$   r%   rq      s    rq   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_stdio#     

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      r	      )r   	alignment
block_size	cbuf_sizeN)	r   r   r   r   r   rO   rd   get_fapl_directr)   )
r!   r,   default_faplr   r   r   actual_faplactual_alignmentactual_block_sizeactual_cbuf_sizer$   r$   r%   test_direct1  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_sec2c  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)   r5   r   pathexistsr+   r$   r$   r%   	test_coreq  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   r6   r+   r$   r$   r%   r7     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   st   t  }t|ddd}| | | |jd |  | t t|ddd W d   dS 1 s3w   Y  dS )z( Python file object driver is supported r   fileobjr   r   N)	tempfileTemporaryFiler   r   r   r   r)   r   r6   )r!   tfr,   r$   r$   r%   test_fileobj  s   
"zTestDrivers.test_fileobjN)r>   r?   r@   rA   r   
skipUnlessr   namer   r   r   r   r   r   r7   r   r   r   r$   r$   r$   r%   r~     s     

/

r~   )r   rB   r	   zRequires HDF5 before 1.10.2c                   @   rV   )
TestLibverze
        Feature: File format compatibility bounds can be specified when
        opening a file.
    c                 C   (   t |  d}| |jd |  dS ) Opening with no libver arg r   earliestlatestNr   r   r   libverr)   r!   r#   r$   r$   r%   r&        zTestLibver.test_defaultc                 C   s,   t |  ddd}| |jd |  dS )  Opening with single libver arg r   r   r   )r   r   Nr   r   r$   r$   r%   test_single     zTestLibver.test_singlec                 C   ,   t |  ddd}| |jd |  dS ) Opening with two libver args r   r   r   Nr   r   r$   r$   r%   test_multiple  r   zTestLibver.test_multiplec                 C   r   )6 Omitting libver arg results in maximum compatibility r   r   Nr   r   r$   r$   r%   	test_none  r   zTestLibver.test_noneN)r>   r?   r@   rA   r&   r   r   r   r$   r$   r$   r%   r     s    r   zRequires HDF5 1.10.2 or laterc                       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 )TestNewLibverz
        Feature: File format compatibility bounds can be specified when
        opening a file.

        Requirement: HDF5 1.10.2 or later
    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         v110)r      r   v112v114)super
setUpClassru   versionhdf5_version_tupler   )cls	__class__r$   r%   r     s   



zTestNewLibver.setUpClassc                 C   .   t |  d}| |jd| jf |  dS )r   r   r   Nr   r   r   r   r   r)   r   r$   r$   r%   r&        zTestNewLibver.test_defaultc                 C   s4   t |  ddd}| |j| j| jf |  dS )r   r   r   r   Nr   r   r$   r$   r%   r     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   r   )r   r   )r   r   r   Nr   r   r$   r$   r%   r     r   zTestNewLibver.test_multiplec                 C   r   )r   r   r   Nr   r   r$   r$   r%   r     r   zTestNewLibver.test_none)r>   r?   r@   rA   classmethodr   r&   r   r   r   r   skipIfru   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   r6   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   Nr8   )r   r   r)   r   r6   ru   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   r6   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   r6   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   ru   r   read)r!   r   r#   pyfiler$   r$   r%   test_write_blocke  s    


zTestUserblock.test_write_blockN)	r>   r?   r@   rA   r   r   r   r   r   r$   r$   r$   r%   r      s    r   c                   @   rC   )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)r>   r?   r@   rA   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   sR   | j tdd}t|d}| tj| W d   dS 1 s"w   Y  dS )zG Unicode filenames can be used, and seen correctly from python
        r   r   r   N)r   r   r   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   Nr8   )r   r   r   IOErrorr   r:   r$   r$   r%   test_nonexistent_file_unicode  s   "z)TestUnicode.test_nonexistent_file_unicodeN)r>   r?   r@   rA   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   rs   N)r   r   rw   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'   rs   N)r   r   r(   rw   r)   r5   )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   rw   r   r)   )r!   r   r   r$   r$   r%   	test_mode  s
   
zTestFileProperty.test_modeN)r>   r?   r@   rA   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)   r5   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   r6   r(   r   r$   r$   r%   test_closed_file  s
   "zTestClose.test_closed_filec                 C   s2   |   }t|d}|d |  |  d S )Nr   test)r   ru   r   r(   r)   r    r$   r$   r%   "test_close_multiple_default_driver  s
   
z,TestClose.test_close_multiple_default_driverN)r>   r?   r@   rA   r   r  r  r$   r$   r$   r%   r    s
    r  c                   @   rC   )	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)r>   r?   r@   rA   r  r$   r$   r$   r%   r    r   r  c                   @   rC   )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)r>   r?   r@   rA   r
  r$   r$   r$   r%   r    r   r  c                   @   rC   )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)r>   r?   r@   rA   r  r$   r$   r$   r%   r    r   r  c                   @   rp   )!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   boolrO   r)   r5   )r!   rz   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(   rO   validr)   )r!   r"   r#   rz   r{   r  r  r$   r$   r%   test_close_one_handle6  s"   z7TestCloseInvalidatesOpenObjectIDs.test_close_one_handleN)r>   r?   r@   rA   r   r  r$   r$   r$   r%   r     s    r  c                   @   rp   )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_fileQ  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_matchX  s   
"z*TestPathlibSupport.test_pathlib_name_matchN)r>   r?   r@   rA   r  r  r$   r$   r$   r%   r  L  s    r  c                   @   rC   )
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!   rz   r$   r$   r%   test_dump_errore  s   "zTestPickle.test_dump_errorN)r>   r?   r@   rA   r  r$   r$   r$   r%   r  c  s    r  c                   @   sD   e Zd Zdd Zdd Zejjej	j
dk dd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_mpioo  
   "zTestMPI.test_mpioc                 C   r!  )z& Testing creation of file with append r   r#  r1   r%  r&  Nr(  r+  r$   r$   r%   test_mpio_appendw  r.  zTestMPI.test_mpio_append)r      	   z5mpio atomic file operations were added in HDF5 1.8.9+reasonc                 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%  r&  TN)r)  r$  r   r*  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 )r"  r   r#  r   r%  r&  r  N)r)  r$  r   r*  r(   r)   r+  r$   r$   r%   test_close_multiple_mpio_driver  s
   
z'TestMPI.test_close_multiple_mpio_driverN)r>   r?   r@   r-  r/  r   markskipifru   r   r   r5  r6  r$   r$   r$   r%   r   m  s    
	r   c                   @   rp   )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'   r8   T)r   r   r(   r   rw   	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:  rw   r)   r;  r$   r$   r%   test_swmr_mode_consistency  s   
""z'TestSWMRMode.test_swmr_mode_consistencyN)r>   r?   r@   rA   r=  r>  r$   r$   r$   r%   r9    s    r9  )r      r   )r   rB      z+Requires HDF5 >= 1.12.1 or 1.10.x >= 1.10.7r2  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r}|  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|ddd}W d   n1 siw   Y  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   FNzbest-effort)ru   r   r  r   r   r   )r!   tmp_pathr"   r#   h5f_readr$   r$   r%   test_reopen  s$   "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 valuerC  r   zunsupported-valuerD  N)r   r   r6   ru   r   )r!   rF  r"   rG  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 processesrC  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  ru   __file__parent
subprocessrunsys
executable
returncodestderr)r   r   rE  h5py_import_dirprocessr$   r$   r%   open_in_subprocess  s"   
z=TestFileLocking.test_multiprocess.<locals>.open_in_subprocessr   TrD  r   dataNr   F)ru   r   )r!   rF  r"   rU  r#   r$   r$   r%   test_multiprocess  s   
"z!TestFileLocking.test_multiprocessN)r>   r?   r@   rA   rH  rI  rW  r$   r$   r$   r%   rB    s
    rB  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 )NrF   rB   r   c                 S   s   g | ]}|j qS r$   )rO   ).0dr$   r$   r%   
<listcomp>  s    z!test_close_gc.<locals>.<listcomp>)ranger   r   r)   ru   r   valuesappend)writable_fileir   r#   refsr$   r$   r%   test_close_gc  s   
ra  )3rA   r   r   r   r  r   rM  rO  commonr   r   r   r   h5py._hl.filesr   ru   r    r
   r  r   r   r   r   rD   r7  mpi_skiprW   rq   r~   r   r   r   r   r   r   r   r  r  r  r  r  r  r  mpir   r9  r8  environrB  ra  r$   r$   r$   r%   <module>   s~   	t&2+  B`#',
&$;