def no_metadata_segment(): """ Add a segment with two channels, then a second segment with the same metadata as before, so there is only the lead in and binary data """ test_file = GeneratedFile() test_file.add_segment( ("kTocMetaData", "kTocRawData", "kTocNewObjList"), segment_objects_metadata( channel_metadata("/'group'/'channel1'", TDS_TYPE_INT32, 2), channel_metadata("/'group'/'channel2'", TDS_TYPE_INT32, 2), ), "01 00 00 00" "02 00 00 00" "03 00 00 00" "04 00 00 00") test_file.add_segment(("kTocRawData", ), "", "05 00 00 00" "06 00 00 00" "07 00 00 00" "08 00 00 00") expected_data = { ('group', 'channel1'): np.array([1, 2, 5, 6], dtype=np.int32), ('group', 'channel2'): np.array([3, 4, 7, 8], dtype=np.int32), } return test_file, expected_data
def alternating_data_objects_reusing_obj_list(): """ Alternating segments with different objects with data, reusing the object list from the last segment. """ test_file = GeneratedFile() test_file.add_segment( ("kTocMetaData", "kTocRawData", "kTocNewObjList"), segment_objects_metadata( channel_metadata("/'group'/'channel1'", TDS_TYPE_INT32, 2), channel_metadata_with_no_data("/'group'/'channel2'"), ), "01 00 00 00" "02 00 00 00") test_file.add_segment( ("kTocMetaData", "kTocRawData"), segment_objects_metadata( channel_metadata_with_no_data("/'group'/'channel1'"), channel_metadata("/'group'/'channel2'", TDS_TYPE_INT32, 2), ), "03 00 00 00" "04 00 00 00") test_file.add_segment( ("kTocMetaData", "kTocRawData"), segment_objects_metadata( channel_metadata_with_repeated_structure("/'group'/'channel1'"), channel_metadata_with_no_data("/'group'/'channel2'"), ), "05 00 00 00" "06 00 00 00") test_file.add_segment( ("kTocMetaData", "kTocRawData"), segment_objects_metadata( channel_metadata_with_no_data("/'group'/'channel1'"), channel_metadata_with_repeated_structure("/'group'/'channel2'"), ), "07 00 00 00" "08 00 00 00") expected_data = { ('group', 'channel1'): np.array([1, 2, 5, 6], dtype=np.int32), ('group', 'channel2'): np.array([3, 4, 7, 8], dtype=np.int32), } return test_file, expected_data
def test_complex_metadata_reading(benchmark): """ Benchmark reading metadata for a file with many channels and segments with alternating sets of objects """ test_file = GeneratedFile() data = np.array([0] * 5, dtype=np.dtype('int32')).tobytes() test_file.add_segment( ("kTocMetaData", "kTocRawData", "kTocNewObjList"), segment_objects_metadata( channel_metadata("/'group'/'channel0'", TDS_TYPE_INT32, 1), channel_metadata("/'group'/'channel1'", TDS_TYPE_INT32, 1), channel_metadata("/'group'/'channel2'", TDS_TYPE_INT32, 1), channel_metadata("/'group'/'channel3'", TDS_TYPE_INT32, 1), channel_metadata("/'group'/'channel4'", TDS_TYPE_INT32, 1), ), data, binary_data=True) test_file.add_segment( ("kTocMetaData", "kTocRawData", "kTocNewObjList"), segment_objects_metadata( channel_metadata("/'group'/'channel5'", TDS_TYPE_INT32, 1), channel_metadata("/'group'/'channel6'", TDS_TYPE_INT32, 1), channel_metadata("/'group'/'channel7'", TDS_TYPE_INT32, 1), channel_metadata("/'group'/'channel8'", TDS_TYPE_INT32, 1), channel_metadata("/'group'/'channel9'", TDS_TYPE_INT32, 1), ), data, binary_data=True) for _ in range(9): test_file.add_segment( ("kTocMetaData", "kTocRawData", "kTocNewObjList"), segment_objects_metadata( channel_metadata_with_no_data("/'group'/'channel0'"), channel_metadata_with_no_data("/'group'/'channel1'"), channel_metadata_with_no_data("/'group'/'channel2'"), channel_metadata_with_no_data("/'group'/'channel3'"), channel_metadata_with_no_data("/'group'/'channel4'"), channel_metadata_with_repeated_structure( "/'group'/'channel5'"), channel_metadata_with_repeated_structure( "/'group'/'channel6'"), channel_metadata_with_repeated_structure( "/'group'/'channel7'"), channel_metadata_with_repeated_structure( "/'group'/'channel8'"), channel_metadata_with_repeated_structure( "/'group'/'channel9'"), ), data, binary_data=True) test_file.add_segment( ("kTocMetaData", "kTocRawData", "kTocNewObjList"), segment_objects_metadata( channel_metadata_with_repeated_structure( "/'group'/'channel0'"), channel_metadata_with_repeated_structure( "/'group'/'channel1'"), channel_metadata_with_repeated_structure( "/'group'/'channel2'"), channel_metadata_with_repeated_structure( "/'group'/'channel3'"), channel_metadata_with_repeated_structure( "/'group'/'channel4'"), channel_metadata_with_no_data("/'group'/'channel5'"), channel_metadata_with_no_data("/'group'/'channel6'"), channel_metadata_with_no_data("/'group'/'channel7'"), channel_metadata_with_no_data("/'group'/'channel8'"), channel_metadata_with_no_data("/'group'/'channel9'"), ), data, binary_data=True) tdms_file = benchmark(read_metadata_from_start, test_file.get_bytes_io_file()) assert len(tdms_file) == 1 assert len(tdms_file['group']) == 10 for channel_num in range(10): assert len(tdms_file['group']['channel{0}'.format(channel_num)]) == 10
def test_read_with_mismatching_index_file(): """ Test that reading data when the index file doesn't match the data file raises an error """ test_file = GeneratedFile() test_file.add_segment(("kTocMetaData", "kTocRawData", "kTocNewObjList"), segment_objects_metadata( channel_metadata("/'group'/'channel1'", 3, 2), channel_metadata("/'group'/'channel2'", 3, 2), ), "01 00 00 00" "02 00 00 00" "03 00 00 00" "04 00 00 00") test_file.add_segment(("kTocMetaData", "kTocRawData", "kTocNewObjList"), segment_objects_metadata( channel_metadata("/'group'/'channel1'", 3, 2), channel_metadata("/'group'/'channel2'", 3, 2), ), "01 00 00 00" "02 00 00 00" "03 00 00 00" "04 00 00 00") test_file_with_index = GeneratedFile() test_file_with_index.add_segment( ("kTocMetaData", "kTocRawData", "kTocNewObjList"), segment_objects_metadata( channel_metadata("/'group'/'channel1'", 3, 3), channel_metadata("/'group'/'channel2'", 3, 3), ), "01 00 00 00" "02 00 00 00" "03 00 00 00" "04 00 00 00" "05 00 00 00" "06 00 00 00") test_file_with_index.add_segment( ("kTocMetaData", "kTocRawData", "kTocNewObjList"), segment_objects_metadata( channel_metadata("/'group'/'channel1'", 3, 3), channel_metadata("/'group'/'channel2'", 3, 3), ), "01 00 00 00" "02 00 00 00" "03 00 00 00" "04 00 00 00" "05 00 00 00" "06 00 00 00") with test_file.get_tempfile(delete=False) as tdms_file: with test_file_with_index.get_tempfile_with_index( ) as tdms_file_with_index_path: # Move index file from second file to match the name of the first file new_index_file = tdms_file.name + '_index' copyfile(tdms_file_with_index_path + '_index', new_index_file) try: tdms_file.file.close() with pytest.raises(ValueError) as exc_info: _ = TdmsFile.read(tdms_file.name) assert 'Check that the tdms_index file matches the tdms data file' in str( exc_info.value) finally: os.remove(new_index_file) os.remove(tdms_file.name)