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'
Exemple #2
0
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'
Exemple #3
0
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
Exemple #5
0
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])
Exemple #6
0
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'
Exemple #7
0
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"]
Exemple #8
0
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
Exemple #9
0
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'
Exemple #10
0
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"]
Exemple #11
0
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'
Exemple #12
0
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)
Exemple #13
0
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
Exemple #14
0
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'
Exemple #15
0
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]')
Exemple #16
0
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]
Exemple #17
0
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)
Exemple #18
0
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']
Exemple #19
0
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
Exemple #20
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
Exemple #21
0
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
Exemple #22
0
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]')
Exemple #23
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]
Exemple #24
0
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]
Exemple #25
0
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' } }
Exemple #26
0
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'
Exemple #27
0
    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))
Exemple #28
0
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)
Exemple #29
0
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
Exemple #30
0
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
    }]