def test_named_exprs_polymorphic(params_named_exprs_polymorphic): params = params_named_exprs_polymorphic dtree = params['dtree'] assert len(dtree.items) == 4 assert str(dtree.items[1].message.value) == 'bonjour' assert str(dtree.items[1]['?item'].value) == 'bonjour' assert str(dtree.eval_expr('items[1].message.value')) == 'bonjour' assert isinstance(dtree.eval_expr('items[1].?item.value'), model.DataItem) assert str(dtree.eval_expr('items[1].?item.value')) == 'bonjour' assert dtree.items[1]['?type'] == 'message' assert dtree.eval_expr('items[1].?type') == 'message' assert dtree.eval_expr('items[1].?type == "message"') == True assert dtree.eval_expr('items[1].?item.?my_type') == 'message' assert model.make_python_object( dtree.items[2].arr.values) == [1, 2, 3, 4, 5] assert model.make_python_object( dtree.items[2]['?item'].values) == [1, 2, 3, 4, 5] assert model.make_python_object( dtree.eval_expr('items[2].arr.values')) == [1, 2, 3, 4, 5] assert model.make_python_object( dtree.eval_expr('items[2].arr.values[1]')) == 2 assert model.make_python_object( dtree.eval_expr('items[2].?item.values[1]')) == 2 assert dtree.items[2]['?type'] == 'array' assert dtree.eval_expr('items[2].?type') == 'array' assert dtree.eval_expr('items[2].?type == "array"') == True assert dtree.eval_expr('items[2].?item.?my_type') == 'array'
def test_ancestor_operator__as_type(params_ancestor_operator__as_type): params = params_ancestor_operator__as_type dtree = params['dtree'] assert model.make_python_object(dtree.eval_expr('^contents')) == \ '\x10\x00\x00\x00as contents data' assert model.make_python_object(dtree.eval_expr('^^contents')) == \ '\x10\x00\x00\x00as contents data'
def test_varint_in_blocks(params_varint_in_blocks): params = params_varint_in_blocks dtree = params['dtree'] assert len(dtree.blocks) == 2 block0 = dtree.blocks[0] assert model.make_python_object(block0.data) == 'weeeeeeeez' block1 = dtree.blocks[1] assert model.make_python_object(block1.data) == 'wiiiiiiiiz'
def test_named_exprs_5(params_named_exprs_5): params = params_named_exprs_5 dtree = params['dtree'] assert dtree.nb_series == 3 assert model.make_python_object(dtree.series[2].values) == [1, 2, 3, 4] assert model.make_python_object(dtree.series[1].values) == [1, 2] assert model.make_python_object(dtree.series[0].values) == [1, 2, 3] assert dtree['?first_series_first_value'] == 1 assert dtree.eval_expr('?first_series.values[0]') == 1
def test_tinydb(spec, data_ok1): board = model.Board() board.add_spec('Spec', spec) board.add_data_source('data', data_ok1) dom = board.eval_expr('data <> Spec.Schema') assert len(dom['values']) == 3 values = dom['values'] assert str(values[1].key_value) == 'size' with pytest.raises(IndexError): a = values[3].key_value with pytest.raises(TypeError): b = values[-1].key_value expected_keys = ['color', 'size', 'description'] niter = 0 for item, expected_key in zip(values, expected_keys): assert str(item.key_value) == expected_key niter += 1 assert niter == 3 expected_attr_list = [ 'flags', 'key_size', 'key_value', 'value_size', 'value' ] expected_first_item_items = [('flags', 0), ('key_size', 5), ('key_value', 'color'), ('value_size', 3), ('value', 'red')] first_item = True for item in values: # item is a mapping because TinyDBValue is a 'struct' assert list(item.iter_keys()) == expected_attr_list if first_item: #FIXME #assert model.make_python_object( # item.iter_items())) == expected_first_item_items first_item = False description = [ item for item in values if str(item.key_value) == 'description' ][0] item = values[1] assert 'key_value' in item assert str(item.key_value) == 'size' assert str(item['key_value']) == 'size' assert model.make_python_object(item.value) == 'two feet' assert model.make_python_object(item['value']) == 'two feet' assert 'foo' not in item with pytest.raises(AttributeError): print(item.foo) with pytest.raises(KeyError): print(item['foo']) with pytest.raises(IndexError): print(item[42])
def test_u8_array_2(params_u8_array_2): params = params_u8_array_2 dtree = params['dtree'] assert model.make_python_object(dtree.eval_expr('self')) == \ [1, 2, 3, 4, 5] # ancestor is the data source filter assert model.make_python_object(dtree.eval_expr('^self')) == \ '\x01\x02\x03\x04\x05' assert model.make_python_object(dtree.eval_expr('self[3]')) == 4 assert model.make_python_object(dtree.eval_expr('^self[3]')) == '\x04'
def test_user_filter_extern(params_user_filter_extern): params = params_user_filter_extern board, dtree = params['board'], params['dtree'] board.register_filter('godify', Godify) print model.make_python_object(dtree.eval_expr('contents')) assert model.make_python_object( dtree.eval_expr('contents')) == \ ["Do as she wants", "Do as He wants", "Do as thou want"]
def test_sst_index_block(spec_sst_index, data_sst_index_block_1): data, nb_entries = (data_sst_index_block_1['data'], data_sst_index_block_1['nb_entries']) dtree = model.DataTree(data, spec_sst_index) assert len(dtree.entries) == nb_entries last_index = None for i, entry in enumerate(dtree.entries): last_index = i model.make_python_object(entry) assert last_index == nb_entries - 1 assert len(dtree.restarts) == dtree.nb_restarts assert model.get_size(dtree.restarts) == dtree.nb_restarts * 4
def test_u8_array(params_u8_array): params = params_u8_array dtree = params['dtree'] assert model.make_python_object(dtree.eval_expr('contents')) == \ [1, 2, 3, 4, 5] # contents itself has no attached filter, so result is unchanged assert model.make_python_object(dtree.eval_expr('^contents')) == \ [1, 2, 3, 4, 5] assert model.make_python_object(dtree.eval_expr('contents[3]')) == 4 assert model.make_python_object(dtree.eval_expr('^contents[3]')) == '\x04'
def test_user_filter_extern_use_spec(): board = model.Board() board.add_data_source('data', conftest.to_bytes(data_file_user_filter_extern)) board.use_spec(spec_file_user_filter_extern) board.register_filter('godify', Godify) dtree = board.eval_expr('data <> Schema') print model.make_python_object(dtree.eval_expr('contents')) assert model.make_python_object( dtree.eval_expr('contents')) == \ ["Do as she wants", "Do as He wants", "Do as thou want"]
def test_filter_2(params_filter_2): params = params_filter_2 dtree = params['dtree'] assert dtree.blocks[1].get_offset() == 0 assert dtree.blocks[1].get_size() == 22 assert dtree.eval_expr('blocks[1]').get_offset() == 0 assert dtree.eval_expr('blocks[1]').get_size() == 22 assert dtree.blocks[1].n == 18 assert str(dtree.blocks[1].data) == 'more contents data' assert str(dtree.blocks[1]['?data_preview']) == 'more conte' assert str(dtree.blocks[1]['?data_glimpse']) == 'dat' assert str(dtree.eval_expr('blocks[1].?data_preview')) == 'more conte' assert str(dtree.eval_expr('blocks[1].?data_glimpse')) == 'dat' assert dtree.blocks[0].n == 16 assert str(dtree.blocks[0].data) == 'as contents data' assert model.make_python_object(dtree.blocks[2]) == { 'n': 23, 'data': 'even more contents data' } assert model.make_python_object(dtree.eval_expr('blocks[2]')) == { 'n': 23, 'data': 'even more contents data' } assert dtree.eval_expr('blocks[1].?data_preview').get_size() == 10 assert dtree.eval_expr('blocks[1].?data_glimpse').get_size() == 3 # up one ancestor => input for base64 filter daddy = dtree.eval_expr('^blocks[1]') assert daddy.get_offset() == 0 assert daddy.get_size() == 22 # filtered output assert daddy == '\x12\00\00\00more contents data' # up two ancestors => input for newline-terminated string # there are only two ancestors, so up to three ancestors shall # return identical results than up two ancestors for grandpa in [ dtree.eval_expr('^^blocks[1]'), dtree.eval_expr('^^^blocks[1]') ]: assert grandpa.get_offset() == 29 assert grandpa.get_size() == 32 # filtered output (i.e. without final newline) assert str(grandpa) == 'EgAAAG1vcmUgY29udGVudHMgZGF0YQ==' assert model.make_python_object(dtree.eval_expr('^blocks[2]')) == \ '\x17\x00\x00\x00even more contents data' assert model.make_python_object(dtree.eval_expr('^(^blocks)[2]')) == \ '\x17\x00\x00\x00even more contents data' assert model.make_python_object(dtree.eval_expr('^^blocks[2]')) == \ 'FwAAAGV2ZW4gbW9yZSBjb250ZW50cyBkYXRh' assert model.make_python_object(dtree.eval_expr('^^blocks[1..][1]')) == \ 'FwAAAGV2ZW4gbW9yZSBjb250ZW50cyBkYXRh' assert model.make_python_object(dtree.eval_expr('^^^blocks[2]')) == \ 'FwAAAGV2ZW4gbW9yZSBjb250ZW50cyBkYXRh' assert model.make_python_object(dtree.eval_expr('^^^^blocks[2]')) == \ 'FwAAAGV2ZW4gbW9yZSBjb250ZW50cyBkYXRh'
def test_leveldb_log_empty(spec_log, data_log_empty): dtree = model.DataTree(data_log_empty, spec_log) assert model.make_python_object(dtree.head_blocks) == [] assert model.make_python_object(dtree.tail_block.records) == [] assert len(dtree.head_blocks) == 0 assert len(dtree.tail_block.records) == 0 assert model.eval('sizeof(head_blocks)', dtree) == 0 assert model.eval('sizeof(tail_block.records)', dtree) == 0 with pytest.raises(IndexError): dtree.tail_block.records[0] with pytest.raises(ValueError): model.eval('tail_block.records[0]', dtree)
def test_filter_in_field_expression(params_filter_in_field_expression): params = params_filter_in_field_expression dtree = params['dtree'] assert dtree.a_as_int == 1 assert dtree.b_as_int == 2 assert dtree['?nb_as_struct'].value == 1 with pytest.raises(AttributeError): dtree.eval_expr('^?nb_as_struct').value assert dtree.eval_expr('a_as_int') == 1 assert dtree.eval_expr('a <> Spec.Int') == 1 assert model.make_python_object( dtree.eval_expr('a <> Spec.UnusedByteStruct').by) == '\x01' assert model.make_python_object(dtree.eval_expr('^a_as_int')) == '\x01' with pytest.raises(AttributeError): dtree.eval_expr('^?a_as_struct').value
def test_filter_1(params_filter_1): params = params_filter_1 dtree, stored_content_length = (params['dtree'], params['stored_content_length']) assert dtree.contents.n == stored_content_length assert len(dtree.contents.data) == 16 assert memoryview(dtree.contents.data) == 'as contents data' assert model.make_python_object(dtree.contents) == { 'n': stored_content_length, 'data': 'as contents data' } assert dtree.contents.n == stored_content_length assert dtree.eval_expr('contents.n') == stored_content_length assert model.make_python_object(dtree.eval_expr('^contents.n')) == \ chr(stored_content_length) + '\x00\x00\x00'
def test_leveldb_log_small(spec_log, data_log_small): board = model.Board() board.add_spec('Log', spec_log) board.add_data_source('data', data_log_small) dtree = board.eval_expr('data <> Log.LogFile') assert model.make_python_object(dtree.head_blocks) == [] records = dtree.tail_block.records assert len(records) == 2 assert records[0].checksum == 0xC227CC1B assert records[0].length == 33 assert records[0].rtype == 1 assert len(records[0].data) == 33 assert dtree.eval_expr('sizeof(tail_block.records[0])') == 40 assert records[1].checksum == 0x6EC2C495 assert records[1].length == 39 assert records[1].rtype == 1 assert len(records[1].data) == 39 assert dtree.eval_expr('sizeof(tail_block.records[1])') == 46 assert dtree.eval_expr('sizeof(tail_block.records)') == 86 assert dtree.eval_expr('sizeof(tail_block)') == 86 with pytest.raises(IndexError): dummy = records[2] with pytest.raises(ValueError): dtree.eval_expr('tail_block.records[2]')
def test_array_flat(params_array_flat): params = params_array_flat dtree = params['dtree'] assert len(dtree.integers) == 10 assert dtree.integers.get_size() == 10 for i in range(10): mapped_i = (i * 7) % 10 assert dtree.integers[mapped_i] == mapped_i assert dtree.integers[4:8][1] == 5 assert dtree.integers[:][4:8][1] == 5 assert dtree.integers[2:][2:6][1] == 5 assert dtree.integers[2:][:6][1] == 3 assert model.make_python_object(dtree.integers[5:9]) == [5, 6, 7, 8] assert model.make_python_object(dtree.integers[:][5:9]) == [5, 6, 7, 8] assert model.make_python_object(dtree.integers[:9][5:]) == [5, 6, 7, 8]
def test_leveldb_log_small(spec_log, data_log_small): dtree = model.DataTree(data_log_small, spec_log) assert model.make_python_object(dtree.head_blocks) == [] records = dtree.tail_block.records assert len(records) == 2 assert records[0].checksum == 0xC227CC1B assert records[0].length == 33 assert records[0].rtype == 1 assert len(records[0].data) == 33 assert model.eval('sizeof(tail_block.records[0])', dtree) == 40 assert records[1].checksum == 0x6EC2C495 assert records[1].length == 39 assert records[1].rtype == 1 assert len(records[1].data) == 39 assert model.eval('sizeof(tail_block.records[1])', dtree) == 46 assert model.eval('sizeof(tail_block.records)', dtree) == 86 assert model.eval('sizeof(tail_block)', dtree) == 86 with pytest.raises(IndexError): dummy = records[2] with pytest.raises(ValueError): model.eval('tail_block.records[2]', dtree)
def test_string(params_string): params = params_string dtree = params['dtree'] assert len(dtree.string_table) == 5 for i, s in enumerate(dtree.string_table): assert model.make_python_object(dtree.string_table) == \ ['Bonjour', 'Hello', 'Guten Tag', 'Hola', 'Privet']
def test_empty_struct(params_empty_struct): params = params_empty_struct dtree = params['dtree'] assert len(list(dtree.empty.iter_keys())) == 0 assert memoryview(dtree.empty) == '' assert model.make_python_object(dtree.empty) == {} assert dtree.eval_expr('sizeof empty') == 0
def test_non_slack_array_filtered(params_non_slack_array_filtered): params = params_non_slack_array_filtered dtree = params['dtree'] assert str(dtree.contents) == 'hello' assert str(dtree.contents[1:]) == 'ello' assert model.make_python_object(dtree.eval_expr('contents')) == 'hello' assert model.make_python_object(dtree.eval_expr('contents[1..]')) == 'ello' assert dtree.eval_expr('len(contents)') == 5 assert len(dtree.eval_expr('contents')) == 5 assert dtree.eval_expr('len(^contents)') == 8 assert len(dtree.eval_expr('^contents')) == 8 assert dtree.eval_expr('len(contents[1..])') == 4 assert len(dtree.eval_expr('contents[1..]')) == 4 assert dtree.eval_expr('sizeof(contents)') == 8 assert dtree.eval_expr('sizeof(^contents)') == 8 assert dtree.eval_expr('sizeof((^contents)[1..])') == 7
def test_embedded(params): dtree, pad_string = params['dtree'], params['pad_string'] assert len(dtree.greeting_set.greetings) == 3 assert model.make_python_object( dtree.greeting_set.greetings[0].contents) == 'Hello' assert model.make_python_object( dtree.greeting_set.greetings[1].contents) == 'Bonjour' assert model.make_python_object( dtree.greeting_set.greetings[2].contents) == 'Guten Tag' assert model.make_python_object( dtree.garbage) == 'garbage at the end of file' with pytest.raises(IndexError): dtree.greeting_set.greetings[3] assert model.make_python_object(dtree.greeting_set.padding) == pad_string
def test_leveldb_log_empty(spec_log, data_log_empty): board = model.Board() board.add_spec('Log', spec_log) board.add_data_source('data', data_log_empty) dtree = board.eval_expr('data <> Log.LogFile') assert model.make_python_object(dtree.head_blocks) == [] assert model.make_python_object(dtree.tail_block.records) == [] assert len(dtree.head_blocks) == 0 assert len(dtree.tail_block.records) == 0 assert dtree.eval_expr('sizeof(head_blocks)') == 0 assert dtree.eval_expr('sizeof(tail_block.records)') == 0 with pytest.raises(IndexError): dtree.tail_block.records[0] with pytest.raises(ValueError): dtree.eval_expr('tail_block.records[0]')
def test_dynamic_filter_param_integer(params_dynamic_filter_param_integer): params = params_dynamic_filter_param_integer dtree, error = params['dtree'], params['error'] if error: with pytest.raises(model.DataError): print dtree.values[0] else: assert model.make_python_object(dtree.values) == [1, 2, 3, 4, 5]
def test_conditional_fields(params_conditional_fields): params = params_conditional_fields dtree = params['dtree'] expected_values = [1, 'aloha!', 'mahalo!', 2, 'abcde'] assert len(dtree.items) == len(expected_values) for i in range(len(expected_values)): item = dtree.items[i].item assert model.make_python_object(item.value) == expected_values[i]
def test_filter(params_filter): params = params_filter dtree, stored_content_length = (params['dtree'], params['stored_content_length']) assert dtree.contents.n == stored_content_length assert len(dtree.contents.data) == 16 assert memoryview(dtree.contents.data) == 'as contents data' assert model.make_python_object(dtree) == { 'contents': {'n': stored_content_length, 'data': 'as contents data' } }
def test_array_raw_bytes(params_array_raw_bytes): params = params_array_raw_bytes dtree = params['dtree'] assert len(dtree.integers) == 10 assert dtree.integers.get_size() == 10 for i in range(10): mapped_i = (i * 7) % 10 assert model.make_python_object(dtree.integers[mapped_i]) \ == chr(mapped_i) assert dtree.eval_expr('?integers[5..]') == '\x05\x06\x07\x08\x09'
def do_print(self, args): """Print the value of an expression Usage: print <expression> """ expr = args if not expr: raise CommandError('print', "missing expression argument to 'print'") expr_value = self.board.eval_expr(expr) print repr(model.make_python_object(expr_value))
def test_file_string_array(params_file_string_array): params = params_file_string_array dtree = params['dtree'] assert len(dtree) == 3 assert model.make_python_object(dtree) == ['hello', 'hola', 'bonjour'] assert dtree.eval_expr('self[1]') == 'hola' assert dtree.eval_expr('^self[1]') == 'hola' assert dtree.eval_expr('^self') == 'hello\nhola\nbonjour\n' assert dtree.eval_expr('^^self') == 'hello\nhola\nbonjour\n' os.unlink(TEST_FILE_PATH)
def test_footer_var_sized_array_const_item_size( params_footer_var_sized_array_const_item_size): params = params_footer_var_sized_array_const_item_size dtree = params['dtree'] assert dtree.root.footer.get_size() == 11 assert dtree.root.footer.footer_items.get_size() == 10 assert dtree.root.footer.nb_footer_items == 5 assert memoryview(dtree.root.contents) == 'some random data' assert model.make_python_object(dtree.root.footer.footer_items) == \ [1, 2, 3, 4, 5] assert dtree.root.get_size() == 27
def test_array_items(params_array_items): params = params_array_items dtree, sizeof_array = params['dtree'], params['sizeof_array'] assert len(dtree.integers) == 10 assert dtree.integers.get_size() == sizeof_array for i in range(10): mapped_i = (i * 7) % 10 assert dtree.integers[mapped_i].value == mapped_i assert dtree.integers[4:8][1].value == 5 assert dtree.integers[:][4:8][1].value == 5 assert dtree.integers[2:][2:6][1].value == 5 assert dtree.integers[2:][:6][1].value == 3 assert model.make_python_object(dtree.integers[5:9]) == [{ 'value': 5 }, { 'value': 6 }, { 'value': 7 }, { 'value': 8 }] assert model.make_python_object(dtree.integers[:][5:9]) == [{ 'value': 5 }, { 'value': 6 }, { 'value': 7 }, { 'value': 8 }] assert model.make_python_object(dtree.integers[:9][5:]) == [{ 'value': 5 }, { 'value': 6 }, { 'value': 7 }, { 'value': 8 }]