|
44 | 44 | open_mfdataset, |
45 | 45 | save_mfdataset, |
46 | 46 | ) |
47 | | -from xarray.backends.common import robust_getitem |
| 47 | +from xarray.backends.common import _open_remote_file, robust_getitem |
48 | 48 | from xarray.backends.h5netcdf_ import H5netcdfBackendEntrypoint |
49 | 49 | from xarray.backends.netcdf3 import _nc3_dtype_coercions |
50 | 50 | from xarray.backends.netCDF4_ import ( |
@@ -5298,6 +5298,62 @@ def test_write_inconsistent_chunks(self) -> None: |
5298 | 5298 | assert actual["y"].encoding["chunksizes"] == (100, 50) |
5299 | 5299 |
|
5300 | 5300 |
|
| 5301 | +@requires_h5netcdf |
| 5302 | +@requires_fsspec |
| 5303 | +@pytest.mark.parametrize( |
| 5304 | + "open_kwargs, expected_cache_type, expected_block_size", |
| 5305 | + [ |
| 5306 | + # Default: blockcache with 4MB block size |
| 5307 | + (None, "blockcache", 4 * 1024 * 1024), |
| 5308 | + ({}, "blockcache", 4 * 1024 * 1024), |
| 5309 | + # Custom block_size still uses blockcache |
| 5310 | + ({"block_size": 8 * 1024 * 1024}, "blockcache", 8 * 1024 * 1024), |
| 5311 | + # Explicit blockcache with default block_size |
| 5312 | + ({"cache_type": "blockcache"}, "blockcache", 4 * 1024 * 1024), |
| 5313 | + # Custom cache_type: no block_size default injected |
| 5314 | + ({"cache_type": "readahead"}, "readahead", None), |
| 5315 | + ], |
| 5316 | + ids=["default", "empty-dict", "8mb", "blockcache", "readahead"], |
| 5317 | +) |
| 5318 | +def test_h5netcdf_open_kwargs( |
| 5319 | + open_kwargs, expected_cache_type, expected_block_size |
| 5320 | +) -> None: |
| 5321 | + """Test that open_kwargs are forwarded to the remote file opener.""" |
| 5322 | + expected = create_test_data() |
| 5323 | + with create_tmp_file() as tmp_file: |
| 5324 | + expected.to_netcdf(tmp_file, engine="h5netcdf") |
| 5325 | + |
| 5326 | + captured = {} |
| 5327 | + |
| 5328 | + def capturing_open_remote_file( |
| 5329 | + file, mode, storage_options=None, open_kwargs=None |
| 5330 | + ): |
| 5331 | + captured["open_kwargs"] = open_kwargs |
| 5332 | + return _open_remote_file( |
| 5333 | + file, |
| 5334 | + mode=mode, |
| 5335 | + storage_options=storage_options, |
| 5336 | + open_kwargs=open_kwargs, |
| 5337 | + ) |
| 5338 | + |
| 5339 | + with patch( |
| 5340 | + "xarray.backends.h5netcdf_._open_remote_file", |
| 5341 | + side_effect=capturing_open_remote_file, |
| 5342 | + ): |
| 5343 | + # Use a file:// URI so is_remote_uri returns True and _open_remote_file is called |
| 5344 | + file_uri = f"file://{tmp_file}" |
| 5345 | + with open_dataset( |
| 5346 | + file_uri, engine="h5netcdf", open_kwargs=open_kwargs |
| 5347 | + ) as actual: |
| 5348 | + assert_identical(actual, expected) |
| 5349 | + |
| 5350 | + assert captured["open_kwargs"]["cache_type"] == expected_cache_type |
| 5351 | + if expected_block_size is None: |
| 5352 | + assert "block_size" not in captured["open_kwargs"] |
| 5353 | + else: |
| 5354 | + assert captured["open_kwargs"]["block_size"] == expected_block_size |
| 5355 | + |
| 5356 | + |
5301 | 5357 | @requires_netCDF4 |
5302 | 5358 | @requires_h5netcdf |
5303 | 5359 | def test_memoryview_write_h5netcdf_read_netcdf4() -> None: |
|
0 commit comments