1+ from pathlib import Path
12import wkw
23import numpy as np
34import shutil
@@ -50,14 +51,12 @@ def test_non_negative_offsets():
5051
5152def test_empty_read ():
5253 with wkw .Dataset .create ("tests/tmp" , wkw .Header (np .uint8 )) as dataset :
53-
5454 data = dataset .read ((1 , 1 , 1 ), (0 , 0 , 0 ))
5555 assert data .shape == (1 , 0 , 0 , 0 )
5656
5757
5858def test_readwrite ():
5959 with wkw .Dataset .create ("tests/tmp" , wkw .Header (np .uint8 )) as dataset :
60-
6160 header_size = path .getsize (path .join ("tests/tmp" , "header.wkw" ))
6261 test_data = generate_test_data (dataset .header .voxel_type )
6362
@@ -96,7 +95,6 @@ def test_readwrite_live_compression_should_enforce_full_file_write():
9695 with wkw .Dataset .create (
9796 "tests/tmp" , wkw .Header (np .uint8 , block_type = BLOCK_TYPE_LZ4 )
9897 ) as dataset :
99-
10098 test_data = generate_test_data (dataset .header .voxel_type )
10199 dataset .write (POSITION , test_data )
102100
@@ -145,7 +143,6 @@ def test_readwrite_live_compression_should_truncate():
145143
146144def test_compress ():
147145 with wkw .Dataset .create ("tests/tmp" , wkw .Header (np .uint8 )) as dataset :
148-
149146 test_data = generate_test_data (dataset .header .voxel_type )
150147 dataset .write (POSITION , test_data )
151148
@@ -269,7 +266,6 @@ def write_and_test_in_given_order(wkw_path, order):
269266
270267
271268def test_multiple_writes_and_reads ():
272-
273269 mem_buffer = np .zeros ((200 , 200 , 200 ), dtype = np .uint8 , order = "F" )
274270 with wkw .Dataset .create ("tests/tmp" , wkw .Header (np .uint8 )) as dataset :
275271 for i in range (10 ):
@@ -289,7 +285,6 @@ def test_multiple_writes_and_reads():
289285
290286
291287def test_multi_channel_column_major_order ():
292-
293288 with wkw .Dataset .create (
294289 "tests/tmp" , wkw .Header (np .uint8 , num_channels = 3 )
295290 ) as dataset :
@@ -340,6 +335,31 @@ def test_invalid_dataset():
340335 print (excinfo .value )
341336
342337
338+ def test_dataset_with_invalid_jumptable ():
339+ with wkw .Dataset .create (
340+ "tests/tmp" ,
341+ wkw .Header (np .uint8 , block_type = wkw .Header .BLOCK_TYPE_LZ4HC , file_len = 4 ),
342+ ) as dataset :
343+ test_data = generate_test_data (
344+ dataset .header .voxel_type , (32 * 4 , 32 * 4 , 32 * 4 )
345+ )
346+ dataset .write ((0 , 0 , 0 ), test_data )
347+
348+ # reset jumptable with zeros
349+ data_path = Path ("tests/tmp" ) / "z0" / "y0" / "x0.wkw"
350+ wkw_file_bytes = bytearray (data_path .read_bytes ())
351+ zeros = b"\x00 " * (4 ** 3 * 8 )
352+ wkw_file_bytes [16 : (16 + (4 ** 3 ) * 8 )] = zeros
353+ data_path .write_bytes (wkw_file_bytes )
354+
355+ with pytest .raises (wkw .wkw .WKWException ) as excinfo :
356+ with wkw .Dataset .open ("tests/tmp" ) as dataset :
357+ dataset .read ((0 , 0 , 0 ), (32 * 4 ,) * 3 )
358+
359+ print (excinfo )
360+ assert "Corrupt jump table" in str (excinfo )
361+
362+
343363def generate_test_data (dtype , size = SIZE , order = "C" ):
344364 return np .array (
345365 np .random .uniform (np .iinfo (dtype ).min , np .iinfo (dtype ).max , size ).astype (dtype ),
0 commit comments