
    utf~                        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/d: Z0y);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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      ^/var/www/html/software/conda/envs/higlass/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                    | j                         }t        |d      }	 | j                  |       |j                  d       d|v sJ 	 |j	                          t        |d      }	 d|v sJ |j                  d       d|v sJ 	 |j	                          t        j                  |t        j                         	 t        j                  t              5  t        |d       ddd       t        j                  |t        j                  t        j                  z         y# |j	                          w xY w# |j	                          w xY w# 1 sw Y   ixY w# t        j                  |t        j                  t        j                  z         w xY 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.   s      r'   test_appendzTestFileOpen.test_appendT   s#   5#	OOC U#C<<IIK5#	C<<U#C<<IIK
%	:/ !UC ! HHUDLL4==89 IIK IIK! ! HHUDLL4==89s;   (D $D0 7E EE D-0EE
E 7F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_readonlyn   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_readwritez   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   Nr@   )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!   r=   r	   r   )r$   s    r'   test_invalid_modezTestFileOpen.test_invalid_mode   s5    z* 	,
+	, 	, 	,s	   :AN)__name__
__module____qualname____doc__r(   r0   r5   r:   r>   rA   rD   rG    r1   r'   r   r       s/    4	:4

,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   )rR   Ninvalidr*   )rQ   uint8)dtyper   .r8   r   r
   foo2)
r   r	   r   r!   r=   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)rH   rI   rJ   rK   r`   rL   r1   r'   rN   rN      s    r1   rN   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   rP    @  )r   rR   page_buf_sizeNr   re   fsm	aggregater   r	   r!   r"   rC   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.rd      C   r   rP   )r   rR   re   min_meta_keepmin_raw_keepNr   r	   rZ   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.3reasonc                     | 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.rd   r   rP   r   rR   fs_page_sizeNr   r   rf   ri   )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   rx      z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.rd   r   )r   Nr   rf   r   r   r	   rZ   rq   rr   r$   r%   r   r&   rv   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.rd   r   rP   r}   Nr   rQ   rf   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.rd   r
   r   rP   r}   Nr   r   rf   r   rp   )r$   r%   r   rs   r&   rv   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)rH   rI   rJ   rK   rj   rw   r   markskipifh5pyversionhdf5_version_tupler   r   r   r   rL   r1   r'   rb   rb      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   rb   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   r@   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   /Externalr@   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)rH   rI   rJ   rK   r   r   rL   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_stdio9  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   ry   r
      )r   	alignment
block_size	cbuf_sizeN)	r	   r   r   r   r   rZ   rq   get_fapl_directr,   )
r$   r/   default_faplr   r   r   actual_faplactual_alignmentactual_block_sizeactual_cbuf_sizes
             r'   test_directzTestDrivers.test_directG  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_sec2y  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,   r<   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!   r=   r.   s      r'   r>   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                 2   t        j                         }t        |dd      }| j                  |       | j	                  |j
                  d       |j                          | j                  t              5  t        |dd       ddd       y# 1 sw Y   yxY w)z( Python file object driver is supported r   fileobjr   r   N)	tempfileTemporaryFiler	   r   r   r   r,   r!   r=   )r$   tfr/   s      r'   test_fileobjzTestDrivers.test_fileobj  sv    ##%2s9-Y/		z* 	)S(	) 	) 	)s   5BBN)rH   rI   rJ   rK   r   
skipUnlessr   namer   r   r   r   r   r   r>   r   r   r   rL   r1   r'   r   r   2  s    
 R]]277g%'KL M R]]:67-<7-<^ R]]277g%'JK L1	)r1   r   zNot HDF5 release versionrz   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   )rH   rI   rJ   rK   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!   r=   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   Nr@   )r   r	   r,   r!   r=   r   r$   r   r&   s      r'   test_write_onlyzTestUserblock.test_write_only1  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!   r=   r   r   r  s      r'   test_match_existingz!TestUserblock.test_match_existing=  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!   r=   r	   r  s      r'   test_power_of_twozTestUserblock.test_power_of_twoL  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_blockY  s    {{}s3/	x 		dE"	LL$LLNIIdC 	q= =GGIdD!	V[[-z:LLN LLN GGI LLNs$   C C0 )!D C-0DDN)	rH   rI   rJ   rK   r   r  r  r  r  rL   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_managerz  sC    $++-% 	!OOC 	!C 	! 	!s   AAN)rH   rI   rJ   rK   r  rL   r1   r'   r  r  t  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        |d      5 }| j                  t        j
                  j                  |             ddd       y# 1 sw Y   yxY w)zG Unicode filenames can be used, and seen correctly from python
        r  r  r   N)r   r  r	   r   r   r   r   r#   s      r'   #test_unicode_hdf5_python_consistentz/TestUnicode.test_unicode_hdf5_python_consistent  sR     3v;/% 	3OOBGGNN512	3 	3 	3s   /A  A)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   Nr@   )r   r  r!   r"   r	   rC   s     r'   test_nonexistent_file_unicodez)TestUnicode.test_nonexistent_file_unicode  sw     3v;/w' 		w' 		 		 		 	s   A1A=1A:=BN)rH   rI   rJ   rK   r  r  r!  rL   r1   r'   r  r    s    	3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,   r<   )r$   r%   r%  grpr&  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$   r%  r)  s      r'   	test_modezTestFileProperty.test_mode  sX    T[[]C(	$$U+CSXX]]EJJ7KKMEKKMs   AA. .B N)rH   rI   rJ   rK   r'  r+  r-  rL   r1   r'   r#  r#    s    

!r1   r#  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,   r<   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!   r=   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)rH   rI   rJ   rK   r+  r2  r5  rL   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)rH   rI   rJ   rK   r:  rL   r1   r'   r7  r7    s    r1   r7  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)rH   rI   rJ   rK   r?  rL   r1   r'   r<  r<    s    .r1   r<  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)rH   rI   rJ   rK   rC  rL   r1   r'   rA  rA    s    r1   rA  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   boolrZ   r,   r<   )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+   rZ   validr,   )r$   r%   r&   r   r   rH  rI  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)rH   rI   rJ   rK   r+  rL  rL   r1   r'   rE  rE    s    * r1   rE  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_fileE  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   rP  rQ  r	   r  r   )r$   r&   r   h5f1pathlib_nameh5f2normal_names          r'   test_pathlib_name_matchz*TestPathlibSupport.test_pathlib_name_matchL  s     	8!<<?DdC -D#}}-a ,"mm,\;7	8 	8- -, ,		8 	8s9   "BA>BB
B>B	B
B	BBN)rH   rI   rJ   rK   rR  rX  rL   r1   r'   rN  rN  @  s    &8r1   rN  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_errorY  s]    $++-% 	!""9- !R !	! 	!! !	! 	!s"   A$AA$A!	A$$A-N)rH   rI   rJ   rK   r^  rL   r1   r'   rZ  rZ  W  s
    /!r1   rZ  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mpi4pyrd  r	   
COMM_WORLDr   r$   mpi_file_namerd  r&   s       r'   	test_mpiozTestMPI.test_mpioc  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   rc  r7   re  rf  Nrh  rk  s       r'   test_mpio_appendzTestMPI.test_mpio_appendk  rn  ro  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   rc  r   re  rf  TN)ri  rd  r	   rj  atomicrk  s       r'   test_mpi_atomiczTestMPI.test_mpi_atomics  sL    -V#..I 	Qxx<AH88O8	 	 	s   $AAc                     ddl m} t        |dd|j                        }|j	                  d       |j                          |j                          y)rb  r   rc  r   re  rf  r4  N)ri  rd  r	   rj  r+   r,   rk  s       r'   test_close_multiple_mpio_driverz'TestMPI.test_close_multiple_mpio_driver|  s7    FH	v				r1   N)rH   rI   rJ   rm  rq  rt  rv  rL   r1   r'   r`  r`  a  s    &&r1   r`  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*   r@   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+   rz  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)rH   rI   rJ   rK   r}  r  rL   r1   r'   rx  rx    s    
r1   rx  )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   zbest-effort)r   r	   r9  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   r=   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  rP  rQ  r   __file__parent
subprocessrunsys
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)rH   rI   rJ   rK   r  r  r  rL   r1   r'   r  r    s     -0Er1   r  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)NrQ   r  r   )	ranger  r  r,   r   r	   valuesrZ   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	)1rK   r   r   r   r\  r   r  r  commonr   r   r   r   h5py._hl.filesr   r   r	    r   rP  r   rN   r   mpi_skiprb   r   r   r   r   r   r   r   r  r   r  r#  r/  r7  r<  rA  rE  rN  rZ  mpir`  rx  environr  r  rL   r1   r'   <module>r     sw    	     
 D D %    q,8 q,h# #L IB IB IBX( (VY)( Y)| LL##A&*a/%  =H =	=@]H ]@
! 
!   "GH (   I F$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r1   