| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- import numpy as np
- import pytest
- import h5py
- from .common import TestCase
- class TestDatasetSwmrRead(TestCase):
- """ Testing SWMR functions when reading a dataset.
- Skip this test if the HDF5 library does not have the SWMR features.
- """
- def setUp(self):
- TestCase.setUp(self)
- self.data = np.arange(13).astype('f')
- self.dset = self.f.create_dataset('data', chunks=(13,), maxshape=(None,), data=self.data)
- fname = self.f.filename
- self.f.close()
- self.f = h5py.File(fname, 'r', swmr=True)
- self.dset = self.f['data']
- def test_initial_swmr_mode_on(self):
- """ Verify that the file is initially in SWMR mode"""
- self.assertTrue(self.f.swmr_mode)
- def test_read_data(self):
- self.assertArrayEqual(self.dset, self.data)
- def test_refresh(self):
- self.dset.refresh()
- def test_force_swmr_mode_on_raises(self):
- """ Verify when reading a file cannot be forcibly switched to swmr mode.
- When reading with SWMR the file must be opened with swmr=True."""
- with self.assertRaises(Exception):
- self.f.swmr_mode = True
- self.assertTrue(self.f.swmr_mode)
- def test_force_swmr_mode_off_raises(self):
- """ Switching SWMR write mode off is only possible by closing the file.
- Attempts to forcibly switch off the SWMR mode should raise a ValueError.
- """
- with self.assertRaises(ValueError):
- self.f.swmr_mode = False
- self.assertTrue(self.f.swmr_mode)
- @pytest.mark.thread_unsafe(reason="Can't enable global SWMR flag twice")
- class TestDatasetSwmrWrite(TestCase):
- """ Testing SWMR functions when reading a dataset.
- Skip this test if the HDF5 library does not have the SWMR features.
- """
- def setUp(self):
- """ First setup a file with a small chunked and empty dataset.
- No data written yet.
- """
- # Note that when creating the file, the swmr=True is not required for
- # write, but libver='latest' is required.
- self.f = h5py.File(self.mktemp(), 'w', libver='latest')
- self.data = np.arange(4).astype('f')
- self.dset = self.f.create_dataset('data', shape=(0,), dtype=self.data.dtype, chunks=(2,), maxshape=(None,))
- def test_initial_swmr_mode_off(self):
- """ Verify that the file is not initially in SWMR mode"""
- self.assertFalse(self.f.swmr_mode)
- def test_switch_swmr_mode_on(self):
- """ Switch to SWMR mode and verify """
- self.f.swmr_mode = True
- self.assertTrue(self.f.swmr_mode)
- def test_switch_swmr_mode_off_raises(self):
- """ Switching SWMR write mode off is only possible by closing the file.
- Attempts to forcibly switch off the SWMR mode should raise a ValueError.
- """
- self.f.swmr_mode = True
- self.assertTrue(self.f.swmr_mode)
- with self.assertRaises(ValueError):
- self.f.swmr_mode = False
- self.assertTrue(self.f.swmr_mode)
- def test_extend_dset(self):
- """ Extend and flush a SWMR dataset
- """
- self.f.swmr_mode = True
- self.assertTrue(self.f.swmr_mode)
- self.dset.resize( self.data.shape )
- self.dset[:] = self.data
- self.dset.flush()
- # Refresh and read back data for assertion
- self.dset.refresh()
- self.assertArrayEqual(self.dset, self.data)
- def test_extend_dset_multiple(self):
- self.f.swmr_mode = True
- self.assertTrue(self.f.swmr_mode)
- self.dset.resize( (4,) )
- self.dset[0:] = self.data
- self.dset.flush()
- # Refresh and read back 1st data block for assertion
- self.dset.refresh()
- self.assertArrayEqual(self.dset, self.data)
- self.dset.resize( (8,) )
- self.dset[4:] = self.data
- self.dset.flush()
- # Refresh and read back 1st data block for assertion
- self.dset.refresh()
- self.assertArrayEqual(self.dset[0:4], self.data)
- self.assertArrayEqual(self.dset[4:8], self.data)
|