
    1Vh                        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
e
      Z G d de
      Zej,                  j.                   G d de
             Z G d de
      Z G d de
      Zej,                  j7                  ej8                  j:                  d   dz  dk7  d       G d de
             Z G d de
      Z G d de
      Z  e	jB                  e d       G d de
             Z" G d de
      Z# G d  d!e
      Z$ G d" d#e
      Z% G d$ d%e
      Z& G d& d'e
      Z' G d( d)e
      Z( G d* d+e
      Z) G d, d-e
      Z*ej,                  jV                   G d. d/             Z, G d0 d1e
      Z-ej,                  j7                  ej8                  j:                  d2k  xr: ej8                  j:                  dd d3k7  xs ej8                  j:                  d   d4k  d5      ej,                  j7                  d6ej\                  v d7       G d8 d9                    Z/ej,                  j7                  ej8                  j:                  d:k  d;      ej,                  j7                  d6ej\                  v d7      ej,                  ja                  d<g d=      d>                      Z1d? Z2y)@z`
    File object test module.

    Tests all aspects of File objects, including their creation.
    N   )utTestCaseUNICODE_FILENAMESclosed_tempfile)
direct_vfd)File   )h5c                       e Zd ZdZd Zd Zd Zd Zej                  j                   ej                  d      dk(  xr ej                  dk(  d	
      d        Zd Zd Zd Zd Zy)TestFileOpenz=
        Feature: Opening files with Python-style modes.
    c                 V   | j                         }t        j                  t              5  t	        |      5  	 ddd       ddd       t	        |d      5  	 ddd       t        j                  |t        j                         	 t	        |      5 }| j                  |       | j                  |j                  d       ddd       t        j                  |t        j                         t        |d      5 }|j                  d       ddd       | j                  t               5  t	        |       ddd       y# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# t        j                  |t        j                         w xY w# 1 sw Y   xY w# 1 sw Y   yxY w)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fs      D/home/dcms/DCMS/lib/python3.12/site-packages/h5py/tests/test_file.pytest_defaultzTestFileOpen.test_default&   sP    ]],- 	e 	
 % 		
%	+e ."  -. HHUDMM* % 	!GGG	w' 	K	 	# 	 	
	 	. . HHUDMM*	 		 	si   ED8EEE* .E<E* 4F#F8E	=EEEE'#E* *&FFF(c                     | j                         }t        |d      }| j                  |       |j                  d       |j	                          t        |d      }| j                  d|       |j	                          y)z' Mode 'w' opens file in overwrite mode r   fooN)r   r	   r   create_groupcloseassertNotInr$   r%   fids      r'   test_createzTestFileOpen.test_create@   sa    5#		5#$		    c                     | j                         }t        |d      }| j                  |       |j                          | j	                  t
              5  t        |d       ddd       y# 1 sw Y   yxY w)z( Mode 'w-' opens file in exclusive mode w-N)r   r	   r   r,   r!   FileExistsErrorr.   s      r'   test_create_exclusivez"TestFileOpen.test_create_exclusiveK   s[    5$		/ 		 	 	s   A))A2c                 z   | j                         }t        |d      }	 | j                  |       |j                  d       d|v sJ 	 |j	                          t        |d      }	 d|v sJ |j                  d       d|v sJ 	 |j	                          y# |j	                          w xY w# |j	                          w xY w)zE Mode 'a' opens file in append/readwrite mode, creating if necessary ar*   barN)r   r	   r   r+   r,   r.   s      r'   test_appendzTestFileOpen.test_appendT   s    5#	OOC U#C<<IIK5#	C<<U#C<<IIK IIK IIKs   (B $B( B%(B:CIBUILDWHEEL1linuxz7Linux docker cibuildwheel environment permissions issuereasonc                 $   | j                         }t        |d      5 }|j                  d       ddd       t        j                  |t
        j                         	 t        j                  t              5  t        |d       ddd       t        j                  |t
        j                  t
        j                  z         y# 1 sw Y   xY w# 1 sw Y   KxY w# t        j                  |t
        j                  t
        j                  z         w xY w)z' Mode 'a' fails when file is read-only r7   r*   N)r   r	   r+   r   r   r   r   r   r   PermissionErrorr   r.   s      r'   test_append_permissionsz$TestFileOpen.test_append_permissionsh   s     % 	$U#	$
%	:/ !UC ! HHUDLL4==89	$ 	$! ! HHUDLL4==89s/   C C 5CC  C	CC 7Dc                 N   | j                         }t        |d      }|j                          | j                  |       t        |d      }| j	                  |       | j                  t              5  |j                  d       ddd       |j                          y# 1 sw Y   xY w)z& Mode 'r' opens file in readonly mode r   r   r*   N)r   r	   r,   assertFalser   r!   
ValueErrorr+   r.   s      r'   test_readonlyzTestFileOpen.test_readonlyy   s    5#		5#z* 	$U#	$			$ 	$s   0BB$c                     | j                         }t        |d      }|j                  d       |j                          t        |d      }d|v sJ |j                  d       d|v sJ |j                          y)z1 Mode 'r+' opens existing file in readwrite mode r   r*   r+r8   N)r   r	   r+   r,   r.   s      r'   test_readwritezTestFileOpen.test_readwrite   sk    5#		5$||||		r1   c                     | j                         }| j                  t              5  t        |d       ddd       | j                  t              5  t        |d       ddd       y# 1 sw Y   4xY w# 1 sw Y   yxY w)z( Modes 'r' and 'r+' do not create files r   NrG   )r   r!   r   r	   r$   r%   s     r'   test_nonexistent_filez"TestFileOpen.test_nonexistent_file   sn    01 		01 		 		 		 	s   A&A2&A/2A;c                     | j                  t              5  t        | j                         d       ddd       y# 1 sw Y   yxY w)z  Invalid modes raise ValueError mongooseN)r!   rD   r	   r   )r$   s    r'   test_invalid_modezTestFileOpen.test_invalid_mode   s5    z* 	,
+	, 	, 	,s	   :AN)__name__
__module____qualname____doc__r(   r0   r5   r9   r   markskipifr   getenvsysplatformrA   rE   rH   rK   rN    r1   r'   r   r       s{    4	( [[		.!S(DS\\W-DH  :	:

,r1   r   c                       e Zd ZdZd Zy)TestSpaceStrategyzE
        Feature: Create file with specified file space strategy
    c                    | j                         }t        |dddd      }| j                  |       | j                  t              5  t        |dd       ddd       | j                  t              5  t        | j                         dd	       ddd       |j                  d
dd      }d|d<   |j                  ddd      }d|d<   |d
= |j                          t        |d      }|j                  j                         }|j                         }|d   dk(  sJ |d   dk(  sJ |d   dk(  sJ |j                  ddd      }d|d<   |j                          y# 1 sw Y   xY w# 1 sw Y   xY w)z& Create file with file space strategy r   pageTd   )fs_strategy
fs_persistfs_thresholdr7   )r^   Ninvalidr*   )r]   uint8)dtyper   .r8   r   r
   foo2)
r   r	   r   r!   rD   create_datasetr,   idget_create_plistget_file_space_strategy)r$   r%   r/   dsetplistfs_strats         r'   test_create_with_space_strategyz1TestSpaceStrategy.test_create_with_space_strategy   sq   5#6"6z* 	10	1 z* 	<;	< !!%w!?S	!!%w!?S	J		5#'')002{a {d"#"{c!"!!!&&!@S			-	1 	1	< 	<s   E3E(E%(E1N)rO   rP   rQ   rR   rl   rX   r1   r'   rZ   rZ      s    r1   rZ   c                   ~   e Zd ZdZd Zd Zej                  j                  e	j                  j                  dkD  d      d        Zej                  j                  e	j                  j                  dk  d	      d
        Zej                  j                  e	j                  j                  dk  d	      d        Zd Zy)TestPageBufferingz)
        Feature: Use page buffering
    c                    | j                         }t        |ddd      5  	 ddd       | j                  t              5  t        |dd       ddd       | j                  t              5  t        |ddd       ddd       | j                  t              5  t        |ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   pxY w# 1 sw Y   OxY w# 1 sw Y   yxY w)	z;Allow page buffering only with fs_strategy="page".
        r   r\    @  )r   r^   page_buf_sizeNr   rq   fsm	aggregater   r	   r!   r"   rJ   s     r'   test_only_with_page_strategyz.TestPageBuffering.test_only_with_page_strategy   s     %cvWM 		w' 	9S8	9w' 	LSe7K	Lw' 	RSkQ	R 	R	 		9 	9	L 	L	R 	Rs.   B1B=+C	C1B:=C	CCc                     | j                         }d}d}d}t        |dd|||      5 }|j                  j                         }| j	                  |j                         |||f       ddd       y# 1 sw Y   yxY w)zHVerify set page buffer size, and minimum meta and raw eviction criteria.rp      C   r   r\   )r   r^   rq   min_meta_keepmin_raw_keepNr   r	   rf   get_access_plistr   get_page_buffer_size)r$   r%   pbsmmmrr&   fapls          r'   test_check_page_buf_sizez*TestPageBuffering.test_check_page_buf_size   s    %cv #2BH 	IKL44((*DT6683B-H	I 	I 	Is   >A//A8)r         zRequires HDF5 <= 1.14.3r=   c                     | j                         }d}t        |dd|      5  	 ddd       | j                  t              5  t        |d|dz
         ddd       y# 1 sw Y   9xY w# 1 sw Y   yxY w)	z;Page buffer size must be greater than file space page size.rp   r   r\   r   r^   fs_page_sizeNr   r   rr   ru   )r$   r%   fsps      r'   test_too_small_pbsz$TestPageBuffering.test_too_small_pbs   sr     %cvCH 		w' 	7SA6	7 	7	 		7 	7s   AA(A%(A1r   r      Requires HDF5 >= 1.14.4c                    | j                         }d}t        |d      5  	 ddd       t        |d|      5 }|j                  j                         }|j	                         d   dk(  sJ 	 ddd       y# 1 sw Y   TxY w# 1 sw Y   yxY w)z(Open non-PAGE file with page buffer set.rp   r   )r   Nr   rr   r   r   r	   rf   r}   r~   r$   r%   r   r&   r   s        r'   test_open_nonpage_pbsz'TestPageBuffering.test_open_nonpage_pbs   s     %c" 		%c5 	744((*D,,.q1Q666	7 	7	 		7 	7s   A53B5A>B
c                 $   | j                         }d}t        |dd|      5  	 ddd       t        |d|dz
        5 }|j                  j                         }|j	                         d	   |k(  sJ 	 ddd       y# 1 sw Y   WxY w# 1 sw Y   yxY w)
zBAdjust page buffer size automatically when smaller than file page.rp   r   r\   r   Nr   r]   rr   r   r   r   s        r'   test_smaller_pbsz"TestPageBuffering.test_smaller_pbs   s     %cvCH 		%cS9 	9Q44((*D,,.q1S888	9 	9	 		9 	9s   A:3B:BBc                 B   | j                         }d}d|z  }t        |dd|      5  	 ddd       t        |d|dz
  	      5 }|j                  j                         }| j	                  |j                         d
   |       ddd       y# 1 sw Y   axY w# 1 sw Y   yxY w)zVerify actual page buffer size.rp   r
   r   r\   r   Nr   r   rr   r   r|   )r$   r%   r   r   r&   r   s         r'   test_actual_pbsz!TestPageBuffering.test_actual_pbs  s    #g%cvCH 		%cQ7 	B144((*DT668;SA	B 	B	 		B 	Bs   B	>B	BBN)rO   rP   rQ   rR   rv   r   r   rS   rT   h5pyversionhdf5_version_tupler   r   r   r   rX   r1   r'   rn   rn      s    R	I [[77*D8  :7:7 [[77*D8  :7:7 [[77*D4  6969	Br1   rn   c                       e Zd ZdZd Zd Zy)	TestModesz?
        Feature: File mode can be retrieved via file.mode
    c                    | j                         }t        |d      5 }| j                  |j                  d       ddd       t        |d      5 }| j                  |j                  d       ddd       y# 1 sw Y   ;xY w# 1 sw Y   yxY w)z/ Mode equivalent can be retrieved via property r   rG   Nr   )r   r	   r   r   r#   s      r'   test_mode_attrzTestModes.test_mode_attr  s|    % 	+QVVT*	+% 	*QVVS)	* 	*	+ 	+	* 	*s   A4B 4A= B	c                    | j                         }| j                         }t        |d      }|j                          t        |d      }	 t        j                  |d      |d<   |d   j
                  }| j                  |j                  d       |j                          |j                          t        |d      }	 |d   j
                  }| j                  |j                  d       |j                          |j                          y# |j                          j                          w xY w# |j                          |j                          w xY w)zU Mode property works for files opened via external links

        Issue 190.
        r   /ExternalrG   r   N)r   r	   r,   r   ExternalLinkfiler   r   )r$   fname1fname2f1f2f3s         r'   test_mode_externalzTestModes.test_mode_external   s    
 &#

&#	!..vs;BzNJ$$BRWWd+HHJHHJ&#	J$$BRWWc*HHJHHJ HHJHHJ HHJHHJs   
AD ;+D, "D),"EN)rO   rP   rQ   rR   r   r   rX   r1   r'   r   r     s    *r1   r   c                       e Zd ZdZ ej
                  ej                  dk(  d      d        Z ej
                  e	d      d        Z
 ej
                  ej                  dk(  d      d        Zd	 Zd
 Zd Zd Zd Zd Zy)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                 h   t        | j                         dd      }| j                  |       | j                  |j                  d       |j                          t        | j                         dd      }| j                  |       | j                  |j                  d       |j                          y)z$ Stdio driver is supported on posix r   stdiodriverr7   Nr	   r   r   r   r   r,   r$   r/   s     r'   
test_stdiozTestDrivers.test_stdioD  s     4;;=#g6W-		 4;;=#g6W-		r1   zODIRECT driver is supported on Linux if hdf5 is built with the appriorate flags.c           	      >   t        | j                         dd      }| j                  |       | j                  |j                  d       |j
                  j                         j                         }|j                          t        | j                         dd      }| j                  |       | j                  |j                  d       |j                          ||d   |d   d|d   z  f|d   dz  |d   d|d   z  f|d   d|d   z  d	|d   z  ffD ]{  \  }}}t        | j                         dd|||
      5 }|j
                  j                         j                         }|d   }|d   }|d   }	||k(  sJ ||k(  sJ |	|	k(  sJ 	 ddd       } y# 1 sw Y   xY w)z$ DIRECT driver is supported on Linuxr   directr   r7   r   r   r   r
      )r   	alignment
block_size	cbuf_sizeN)	r	   r   r   r   r   rf   r}   get_fapl_directr,   )
r$   r/   default_faplr   r   r   actual_faplactual_alignmentactual_block_sizeactual_cbuf_sizes
             r'   test_directzTestDrivers.test_directR  s   
 4;;=#h7X.vv..0@@B		 4;;=#h7X.		$ a,q/1|A3FGa1$l1oq<?7JKa!l1o"5q<?7JK	1 	<,Iz9 dkkmS )!+ )+ 
< /2!ff557GGI#.q> $/N!#.q> '9444(J666'+;;;;
< 
<	<
< 
<s   :AFF	z!Sec2 driver is supported on posixc                 h   t        | j                         dd      }| j                  |       | j                  |j                  d       |j                          t        | j                         dd      }| j                  |       | j                  |j                  d       |j                          y)z# Sec2 driver is supported on posix r   sec2r   r7   Nr   r   s     r'   	test_sec2zTestDrivers.test_sec2  s     4;;=#f5V,		 4;;=#f5V,		r1   c                    | j                         }t        |ddd      }| j                  |       | j                  |j                  d       |j                          | j                  t        j                  j                  |             t        | j                         dd      }| j                  |       | j                  |j                  d       |j                          y)z- Core driver is supported (no backing store) r   coreFr   backing_storer7   r   N)
r   r	   r   r   r   r,   rC   r   pathexistsr.   s      r'   	test_corezTestDrivers.test_core  s    5#fEBV,		./ 4;;=#f5V,		r1   c                 8   | j                         }t        |ddd      }|j                  d       |j                          t        |d      }d|v sJ |j                          | j	                  t
              5  t        |dd       ddd       y# 1 sw Y   yxY w)	z3 Core driver saves to file when backing store used r   r   Tr   r*   r   )r   N)r   r	   r+   r,   r!   	TypeErrorr.   s      r'   test_backingzTestDrivers.test_backing  s    5#fDA		5#||		y) 	140	1 	1 	1s   8BBc                 ^   | j                         }t        |d      }|j                  d       |j                          t        |dd      }| j	                  |       d|v sJ | j                  t              5  |j                  d       ddd       |j                          y# 1 sw Y   xY w)z0 Core driver can be used to open existing files r   r*   r   r   r   r8   N)r   r	   r+   r,   r   r!   rD   r.   s      r'   rE   zTestDrivers.test_readonly  s    5#		5#f-||z* 	$U#	$			$ 	$s   8B##B,c                     | j                         }t        |dddd      }| j                  |       |j                          y)z* Core driver supports variable block size r   r      F)r   r   r   N)r   r	   r   r,   r.   s      r'   test_blocksizezTestDrivers.test_blocksize  s7    5#f!&(		r1   c                     | j                         }t        |dd      }|j                          | j                  t        j
                  j                  |dz                t        |dd      }| j                  |       |j                          y)z* Split stores metadata in a separate file r   splitr   z-m.h5r   N)r   r	   r,   r   r   r   r   r.   s      r'   
test_splitzTestDrivers.test_split  sd    5#g.		uw785#g.		r1   c                 R   t        j                         }t        |dd      }| j                  |       | j	                  |j
                  d       |j                          | j                  t              5  t        |dd       ddd       |j                          y# 1 sw Y   xY w)z( Python file object driver is supported r   fileobjr   r   N)	tempfileTemporaryFiler	   r   r   r   r,   r!   rD   )r$   tfr/   s      r'   test_fileobjzTestDrivers.test_fileobj  s    ##%2s9-Y/		z* 	)S(	)

	) 	)s   5BB&N)rO   rP   rQ   rR   r   
skipUnlessr   namer   r   r   r   r   r   rE   r   r   r   rX   r1   r'   r   r   =  s    
 R]]277g%'KL M R]]:67-<7-<^ R]]277g%'JK L1
r1   r   zNot HDF5 release versionr=   c                        e Zd ZdZe fd       Zd Zd Zd Zd Z	 e
j                  ej                  j                  dk  d      d	        Zd
 Zd Z xZS )TestNewLibverze
        Feature: File format compatibility bounds can be specified when
        opening a file.
    c                     t         |           t        j                  j                  dk  rd| _        y t        j                  j                  dk  rd| _        y d| _        y )Nr      r   v110)r      r   v112v114)super
setUpClassr   r   r   latest)cls	__class__s    r'   r   zTestNewLibver.setUpClass  sI     <<**Z7CJ\\,,z9CJCJr1   c                     t        | j                         d      }| j                  |j                  d| j                  f       |j                          y)z Opening with no libver arg r   earliestNr	   r   r   libverr   r,   r$   r&   s     r'   r(   zTestNewLibver.test_default  :    $J#<=		r1   c                     t        | j                         dd      }| j                  |j                  | j                  | j                  f       |j                          y)z  Opening with single libver arg r   r   r   Nr   r   s     r'   test_singlezTestNewLibver.test_single  s@    H5DKK#=>		r1   c                     t        | j                         dd      }| j                  |j                  d| j                  f       |j                          y)z  Opening with "v108" libver arg r   v108r   Nr   r   s     r'   test_single_v108zTestNewLibver.test_single_v108  <    F3FDKK#89		r1   c                     t        | j                         dd      }| j                  |j                  d| j                  f       |j                          y)z  Opening with "v110" libver arg r   r   r   Nr   r   s     r'   test_single_v110zTestNewLibver.test_single_v110  r   r1   r   zRequires HDF5 1.11.4 or laterc                     t        | j                         dd      }| j                  |j                  d| j                  f       |j                          y)z  Opening with "v112" libver arg r   r   r   Nr   r   s     r'   test_single_v112zTestNewLibver.test_single_v112  s>     F3FDKK#89		r1   c                     t        | j                         dd      }| j                  |j                  d       |j	                          y)z Opening with two libver args r   )r   r   r   N)r	   r   r   r   r,   r   s     r'   test_multiplezTestNewLibver.test_multiple  s5    ,@A#78		r1   c                     t        | j                         d      }| j                  |j                  d| j                  f       |j                          y)z6 Omitting libver arg results in maximum compatibility r   r   Nr   r   s     r'   	test_nonezTestNewLibver.test_none  r   r1   )rO   rP   rQ   rR   classmethodr   r(   r   r   r   r   skipIfr   r   r   r   r   r   __classcell__)r   s   @r'   r   r     sm    
 	  	  RYYt||..;.00r1   r   c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)TestUserblockz;
        Feature: Files can be create with user blocks
    c                    t        | j                         dd      }	 | j                  |j                  d       |j	                          t        | j                         dd      }	 | j                  |j                  d       |j	                          t        | j                         dd      }	 | j                  |j                  d       |j	                          | j                  t              5  t        | j                         dd       ddd       y# |j	                          w xY w# |j	                          w xY w# |j	                          w xY w# 1 sw Y   yxY w)zA User blocks created with w, w-, x and properties work correctly r3      userblock_sizexr   nonN)r	   r   r   r  r,   r!   rD   r   s     r'   test_create_blocksizez#TestUserblock.test_create_blocksize&  s	   S9	Q--s3GGIC8	Q--s3GGIC8	Q--s3GGIz* 	;E:	; 	; GGI GGI GGI	; 	;s/   D 'D, 0E 1ED),D>EEc                 d   | j                         }t        |d      }|j                          | j                  t              5  t        j                  |dd      }ddd       | j                  t              5  t        j                  |dd      }ddd       y# 1 sw Y   @xY w# 1 sw Y   yxY w)z# User block only allowed for write r   r   r  r  NrG   )r   r	   r,   r!   rD   r   r$   r   r&   s      r'   test_write_onlyzTestUserblock.test_write_only=  s    {{}sO		z* 	9		$C8A	9 z* 	:		$S9A	: 	:	9 	9	: 	:s   B8B&B#&B/c                 p   | j                         }t        |dd      }|j                          | j                  t              5  t        |dd      }ddd       t        |dd      }	 | j                  |j                  d       |j                          y# 1 sw Y   ExY w# |j                          w xY w)zA User block size must match that of file when opening for append r   r  r  r7   r   N)r   r	   r,   r!   rD   r   r  r  s      r'   test_match_existingz!TestUserblock.test_match_existingI  s    {{}s3/		z* 	5T3t4A	5 s3/	Q--s3GGI	5 	5 GGIs   B*B# B #B5c                 t   | j                         }| j                  t              5  t        |dd      }ddd       | j                  t              5  t        |dd      }ddd       | j                  t              5  t        |dd      }ddd       y# 1 sw Y   bxY w# 1 sw Y   BxY w# 1 sw Y   yxY w)z7 User block size must be a power of 2 and at least 512 r      r  Ni  i  )r   r!   rD   r	   r  s      r'   test_power_of_twozTestUserblock.test_power_of_twoX  s    {{}z* 	4T3s3A	4 z* 	4T3s3A	4 z* 	5T3t4A	5 	5	4 	4	4 	4	5 	5s#   BB">B.B"B+.B7c                 4   | j                         }t        |dd      }|j                  d       |j                          t	        |d      }	 |j                  d       |j                          t        j                  |d      }	 d|v sJ 	 |j                          t	        |d      }	 | j                  |j                  d      d       |j                          y	# |j                          w xY w# |j                          w xY w# |j                          w xY 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&   pyfiles       r'   test_write_blockzTestUserblock.test_write_blocke  s    {{}s3/	x 		dE"	LL$LLNIIdC 	q= =GGIdD!	V[[-z:LLN LLN GGI LLNs$   C C0 )!D C-0DDN)	rO   rP   rQ   rR   r	  r  r  r  r  rX   r1   r'   r  r     s     ;.
:5r1   r  c                       e Zd ZdZd Zy)TestContextManagerzC
        Feature: File objects can be used as context managers
    c                     t        | j                         d      5 }| j                  |       ddd       | j                          y# 1 sw Y   xY w)z- File objects can be used in with statements r   N)r	   r   r   r   s     r'   test_context_managerz'TestContextManager.test_context_manager  sC    $++-% 	!OOC 	!C 	! 	!s   AAN)rO   rP   rQ   rR   r  rX   r1   r'   r  r    s    !r1   r  z#Filesystem unicode support requiredc                   "    e Zd ZdZd Zd Zd Zy)TestUnicodez6
        Feature: Unicode filenames are supported
    c                    | j                  t        d            }t        |d      }	 | j                  |j                  |       | j                  |j                  t               |j                          y# |j                          w xY w)zM Unicode filenames can be used, and retrieved properly via .filename
           prefixr   N)r   chrr	   r   filenameassertIsInstancestrr,   r.   s      r'   test_unicodezTestUnicode.test_unicode  sd     3v;/5#	S\\51!!#,,4IIKCIIKs   <A6 6Bc                    | j                  t        d            }t        t        j                  j
                         ddlm} t        d|       t        d|       t        |d      5 }t        t        j                  | j                               ddd       t        j                  j                  |      sJ y# 1 sw Y   +xY w)	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&   s       r'   #test_unicode_hdf5_python_consistentz/TestUnicode.test_unicode_hdf5_python_consistent  s     3v;/dll 4,.>?	%#$% 	,"**T\\*+	,ww~~e$$$	, 	,s   +)B>>Cc                    | j                  t        d            }| j                  t              5  t	        |d       ddd       | j                  t              5  t	        |d       ddd       y# 1 sw Y   4xY w# 1 sw Y   yxY w)zV
        Modes 'r' and 'r+' do not create files even when given unicode names
        r  r   r   NrG   )r   r"  r!   r"   r	   rJ   s     r'   test_nonexistent_file_unicodez)TestUnicode.test_nonexistent_file_unicode  sw     3v;/w' 		w' 		 		 		 	s   A1A=1A:=BN)rO   rP   rQ   rR   r&  r.  r0  rX   r1   r'   r  r    s    	
%r1   r  c                   "    e Zd ZdZd Zd Zd Zy)TestFilePropertyzk
        Feature: A File object can be retrieved from any child object,
        via the .file property
    c                     | j                         }t        |d      }	 |d   j                  }| j                  ||       |j	                          y# |j	                          w xY w)z, File object can be retrieved from subgroup r   r   N)r   r	   r   r   r,   )r$   r%   hfilehfile2s       r'   test_propertyzTestFileProperty.test_property  sN    UC 	3Z__FUF+KKMEKKMs   !A A"c                    | j                         }t        |d      }|j                  d      }|j                  }|d   j                  }|j	                          | j                  |       | j                  |       | j                  |       y)z8 All retrieved File objects are closed at the same time r   r*   r   N)r   r	   r+   r   r,   rC   )r$   r%   r4  grpr5  hfile3s         r'   
test_closezTestFileProperty.test_close  sr    UC   's  r1   c                    t        | j                         d      }	 |j                  d      }| j                  |j                  j
                  |j
                         |j                          y# |j                          w xY w)z9 Retrieved File objects have a meaningful mode attribute r   r*   N)r	   r   r+   r   r   r   r,   )r$   r4  r8  s      r'   	test_modezTestFileProperty.test_mode  sX    T[[]C(	$$U+CSXX]]EJJ7KKMEKKMs   AA. .B N)rO   rP   rQ   rR   r6  r:  r<  rX   r1   r'   r2  r2    s    

!r1   r2  c                   "    e Zd ZdZd Zd Zd Zy)	TestClosez*
        Feature: Files can be closed
    c                     t        | j                         d      }| j                  |       |j                          | j	                  |       y)z Close file via .close method r   N)r	   r   r   r,   rC   r   s     r'   r:  zTestClose.test_close  s7    4;;=#&		r1   c                     t        | j                         d      }|j                          | j                  t              5  |j                  d       ddd       y# 1 sw Y   yxY w)z0 Trying to modify closed file raises ValueError r   r*   N)r	   r   r,   r!   rD   r+   r   s     r'   test_closed_filezTestClose.test_closed_file  sN    4;;=#&		z* 	$U#	$ 	$ 	$s    AA$c                     | j                         }t        j                  |d      }|j                  d       |j	                          |j	                          y )Nr   test)r   r   r	   r+   r,   r#   s      r'   "test_close_multiple_default_driverz,TestClose.test_close_multiple_default_driver  s;    IIeS!	v				r1   N)rO   rP   rQ   rR   r:  rA  rD  rX   r1   r'   r>  r>    s    $r1   r>  c                       e Zd ZdZd Zy)	TestFlushz+
        Feature: Files can be flushed
    c                 x    t        | j                         d      }|j                          |j                          y)z Flush via .flush method r   N)r	   r   flushr,   r   s     r'   
test_flushzTestFlush.test_flush  s&    4;;=#&				r1   N)rO   rP   rQ   rR   rI  rX   r1   r'   rF  rF    s    r1   rF  c                       e Zd ZdZd Zy)TestReprzE
        Feature: File objects provide a helpful __repr__ string
    c                     t        | j                         d      }| j                  t        |      t               |j                          | j                  t        |      t               y)z8 __repr__ behaves itself when files are open and closed r   N)r	   r   r$  reprr%  r,   r   s     r'   	test_reprzTestRepr.test_repr  sE    4;;=#&d3i-		d3i-r1   N)rO   rP   rQ   rR   rN  rX   r1   r'   rK  rK    s    .r1   rK  c                       e Zd ZdZd Zy)TestFilenamezO
        Feature: The name of a File object can be retrieved via .filename
    c                     | j                         }t        |d      }	 | j                  |j                  |       | j	                  |j                  t
               |j                          y# |j                          w xY w)z, .filename behaves properly for string data r   N)r   r	   r   r#  r$  r%  r,   r.   s      r'   test_filenamezTestFilename.test_filename  sY    5#	S\\51!!#,,4IIKCIIKs   <A+ +A=N)rO   rP   rQ   rR   rR  rX   r1   r'   rP  rP    s    r1   rP  c                       e Zd ZdZd Zd Zy)!TestCloseInvalidatesOpenObjectIDszO
        Ensure that closing a file invalidates object IDs, as appropriate
    c                 d   t        | j                         d      5 }|j                  d      }| j                  t	        |j
                               | j                  t	        |j
                               |j                          | j                  t	        |j
                               | j                  t	        |j
                               ddd       t        | j                         d      5 }|j                  d      }| j                  t	        |j
                               | j                  t	        |j
                               | j                  t	        j
                               | j                  t	        j
                               ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)z; Closing a file invalidates any of the file's open objects r   r*   N)r	   r   r+   r   boolrf   r,   rC   )r$   r   g1r   g2s        r'   r:  z,TestCloseInvalidatesOpenObjectIDs.test_close+  s$   $++-% 	*'BOODK(OODK(HHJT"%%[)T"%%[)	* $++-% 	*'BOODK(OODK(T"%%[)T"%%[)	* 	*	* 	*	* 	*s   B2F/B"F&F#&F/c                 X   | j                         }t        |d      5 }|j                  d       d d d        t        |      }t        |      }|d   }|d   }|j                  j                  sJ |j                  j                  sJ |j                          |j                  j                  rJ |j                  j                  sJ |j                  j                  sJ |j                          |j                  j                  rJ |j                  j                  rJ y # 1 sw Y   xY w)Nr   r*   )r   r	   r+   rf   validr,   )r$   r%   r&   r   r   rW  rX  s          r'   test_close_one_handlez7TestCloseInvalidatesOpenObjectIDs.test_close_one_handle;  s    % 	"NN5!	" %[%[YYuu{{{uu{{{

55;;uu{{{uu{{{

55;;55;;;#	" 	"s   D  D)N)rO   rP   rQ   rR   r:  r[  rX   r1   r'   rT  rT  %  s    * r1   rT  c                       e Zd ZdZd Zd Zy)TestPathlibSupportz6
        Check that h5py doesn't break on pathlib
    c                     t               5 }t        j                  |      }t        |d      5 }| j	                  d       ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)z- Check that pathlib is accepted by h5py.File r   TN)r   pathlibPathr	   r   )r$   r&   r   r   s       r'   test_pathlib_accepted_filez-TestPathlibSupport.test_pathlib_accepted_fileV  s]     	&!<<?DdC &B%&	& 	&& &	& 	&s!   "AAAA	AA%c                 D   t               5 }t        j                  |      }t        |d      5 }|j                  }ddd       t        |d      5 }|j                  }ddd       | j                         ddd       y# 1 sw Y   ExY w# 1 sw Y   0xY w# 1 sw Y   yxY w)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_names          r'   test_pathlib_name_matchz*TestPathlibSupport.test_pathlib_name_match]  s     	8!<<?DdC -D#}}-a ,"mm,\;7	8 	8- -, ,		8 	8s9   "BA>BB
B>B	B
B	BBN)rO   rP   rQ   rR   ra  rg  rX   r1   r'   r]  r]  Q  s    &8r1   r]  c                       e Zd ZdZd Zy)
TestPicklez%Check that h5py.File can't be pickledc                     t        | j                         d      5 }| j                  t              5  t	        j
                  |       d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Nr   )r	   r   r!   r   pickledumps)r$   r   s     r'   test_dump_errorzTestPickle.test_dump_errorj  s]    $++-% 	!""9- !R !	! 	!! !	! 	!s"   A$AA$A!	A$$A-N)rO   rP   rQ   rR   rm  rX   r1   r'   ri  ri  h  s
    /!r1   ri  c                   $    e Zd Zd Zd Zd Zd Zy)TestMPIc                     ddl m} t        |dd|j                        5 }|sJ |j                  dk(  sJ 	 ddd       y# 1 sw Y   yxY w) MPIO driver and options r   MPIr   mpior   commNmpi4pyrs  r	   
COMM_WORLDr   r$   mpi_file_namers  r&   s       r'   	test_mpiozTestMPI.test_mpiot  G    -V#..I 	&QH188v%%%	& 	& 	&   A  A	c                     ddl m} t        |dd|j                        5 }|sJ |j                  dk(  sJ 	 ddd       y# 1 sw Y   yxY w)z& Testing creation of file with append r   rr  r7   rt  ru  Nrw  rz  s       r'   test_mpio_appendzTestMPI.test_mpio_append|  r}  r~  c                     ddl m} t        |dd|j                        5 }|j                  rJ d|_        |j                  sJ 	 ddd       y# 1 sw Y   yxY w)z$ Enable atomic mode for MPIO driver r   rr  r   rt  ru  TN)rx  rs  r	   ry  atomicrz  s       r'   test_mpi_atomiczTestMPI.test_mpi_atomic  sL    -V#..I 	Qxx<AH88O8	 	 	s   $AAc                     ddl m} t        |dd|j                        }|j	                  d       |j                          |j                          y)rq  r   rr  r   rt  ru  rC  N)rx  rs  r	   ry  r+   r,   rz  s       r'   test_close_multiple_mpio_driverz'TestMPI.test_close_multiple_mpio_driver  s7    FH	v				r1   N)rO   rP   rQ   r|  r  r  r  rX   r1   r'   ro  ro  r  s    &&r1   ro  c                       e Zd ZdZd Zd Zy)TestSWMRModez=
        Feature: Create file that switches on SWMR mode
    c                 H   | j                         }t        |dd      }|j                  d      }|j                  |j                  j                  cxk(  rdk(  sJ  J d|_        |j                  |j                  j                  cxk(  rdk(  sJ  J |j                          y )Nr   r   r   r*   rG   T)r   r	   r+   r   r   	swmr_moder,   r$   r%   r/   gs       r'   test_file_mode_generalizesz'TestSWMRMode.test_file_mode_generalizes  s    5#h/U#xx166;;.$..... xx166;;.$.....		r1   c                 H   | j                         }t        |dd      }|j                  d      }|j                  |j                  j                  cxk(  rdk(  sJ  J d|_        |j                  |j                  j                  cxk(  rdk(  sJ  J |j                          y )Nr   r   r   r*   FT)r   r	   r+   r  r   r,   r  s       r'   test_swmr_mode_consistencyz'TestSWMRMode.test_swmr_mode_consistency  s    5#h/U#}} 0 09E99999}} 0 08D88888		r1   N)rO   rP   rQ   rR   r  r  rX   r1   r'   r  r    s    
r1   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                   "    e Zd ZdZd Zd Zd Zy)TestFileLockingz"Test h5py.File file locking optionc                    |dz  }t        j                  |dd      5 }|j                          t        j                  t
              5  t        j                  |dd      5 }	 ddd       ddd       t        j                  |dd      5 }	 ddd       t         j                  j                  dk  r#t        j                  |dd	      5 }	 ddd       nDt        j                  t
              5  t        j                  |dd	      5 }	 ddd       ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   6xY w# 1 sw Y   JxY w# 1 sw Y   NxY w# 1 sw Y   yxY w)
z2Test file locking when opening twice the same filetest.h5r   Tr   lockingr   FNr   best-effort)r   r	   rH  r   r   r"   r   r   )r$   tmp_pathr%   r&   h5f_reads        r'   test_reopenzTestFileLocking.test_reopen  sJ   9$YYu35 	GGI w' YYu3> ( 5sD9 X ||..;YYu3F (  ]]7+ 5sMJ h	 	
      	 	s   *E*D.!D"#D.+ E*D:=E*
E"E*.EE	EE*"D+'D..D7	3E*:E	?E*E	E*EEE'	#E**E3c                     |dz  }t        j                  t              5  t        j                  |dd      5 }	 ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)z&Test with erroneous file locking valuer  r   zunsupported-valuer  N)r   r   rD   r   r	   )r$   r  r%   r  s       r'   test_unsupported_lockingz(TestFileLocking.test_unsupported_locking  s]    9$]]:& 	5s4GH H	 	 	 	s!   AAAA	AA c                     |dz  }d }t        j                  |dd      5 }d|d<   ddd       t        j                  |d	d
      5 } ||dd      sJ 	 ddd       y# 1 sw Y   9xY w# 1 sw Y   yxY w)z<Test file locking option from different concurrent processesr  c                 :   t        t        j                  t        j                        j
                  j
                        }t        j                  t        j                  dd|dt        |       d|d| d	gd      }|j                  d	k(  xr |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runrV   
executable
returncodestderr)r#  r   r  h5py_import_dirprocesss        r'   open_in_subprocessz=TestFileLocking.test_multiprocess.<locals>.open_in_subprocess  s    !',,t}}"="D"D"K"KLO nnNN#& '8}wthj	 B		  $%G %%*A7>>/AAr1   r   Tr  r   dataNr   F)r   r	   )r$   r  r%   r  r&   s        r'   test_multiprocessz!TestFileLocking.test_multiprocess  s    9$	B& YYu35 	AfI	 YYu36 	E!%e#tDDD	E 	E	 		E 	Es   AA+A(+A4N)rO   rP   rQ   rR   r  r  r  rX   r1   r'   r  r    s     -0Er1   r  r   r   zlocking_arg,file_locking_props))F)r   r   )T)r   r   )r  )r   r   c                 6   | dz  }| dz  }t        j                  |d      5 }d|d<   ddd       t        j                  |d      5 }t        j                  |d      |d<   ddd       t        j                  |d	|
      5 }|j                  j	                         j                         }||k(  sJ |d   }|j                  j                  j	                         j                         }||k(  sJ 	 ddd       y# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   yxY w)z5Test that same file locking is used for external linkztest_main.h5ztest_linked.h5r   r   r  Nz/datalinkr   )r  )r   r	   r   rf   r}   get_file_lockingr   )	r  locking_argfile_locking_props
fname_mainfname_elinkr&   locking_infoelink_datasetelink_locking_infos	            r'   test_file_locking_external_linkr    s   $ N*J--K 
;	$ &		:s	# <q%%k7;&	< 
:sK	8 8Att,,.??A1111 &	*//22CCEVVX!%77778 8 < <8 8s$   C7D?A.D7D DDc                 j   t        d      D ]  }g | t        |      <    | j                  }| j                          t        d      D ]Z  }t	        j
                  |d      5 }|j                         D cg c]  }|j                   }}|j                  |       ~d d d        \ y c c}w # 1 sw Y   lxY w)Nr]   r  r   )	ranger%  r#  r,   r   r	   valuesrf   append)writable_fileir#  r&   drefss         r'   test_close_gcr     s    3Z # "c!f# %%H
 2Y YYx% 	"#((*-QADD-D-KK	 	-	 	s   B)2B$B)$B))B2	)3rR   r   r   r   rk  r   r  rV   commonr   r   r   r   h5py._hl.filesr   r   r	    r   r_  r   rZ   rS   mpi_skiprn   r   r   rT   r   r   r   r  r  r   r  r2  r>  rF  rK  rP  rT  r]  ri  mpiro  r  environr  parametrizer  r  rX   r1   r'   <module>r     s    	     
 D D %    |,8 |,~# #L IB IB IBX( (VZ( Z~ LL##A&*a/%  =H =	=@]H ]@
! 
!   "GH%( % I%P$x $N 8
 
.x .8 ") )X8 8.! ! ! ! !H8 : LL##j0 ^LL##BQ'72\dll6U6UVW6X[\6\8  : +rzz9C  E>E >EE	:>EB LL##j0$   rzz)3   $8		 8*r1   