blob: 5b471ea707d81b80f83e448733ff92aaeb1a1e90 [file] [edit]
import fdt
import struct
import pytest
def test_header():
header = fdt.Header()
header.version = fdt.Header.MAX_VERSION
assert header.version == fdt.Header.MAX_VERSION
assert header.size == fdt.Header.MAX_SIZE
with pytest.raises(ValueError):
header.version = fdt.Header.MAX_VERSION + 1
blob = struct.pack('>7I', fdt.Header.MAGIC_NUMBER, 0, 0, 0, 0, 1, 1)
header = fdt.Header.parse(blob)
assert header.version == 1
assert header.size == 32
def test_base_property():
prop = fdt.Property('prop')
assert isinstance(prop, fdt.Property)
assert prop.name == 'prop'
with pytest.raises(AssertionError):
_ = fdt.Property('prop\0')
with pytest.raises(AssertionError):
_ = fdt.Property(5)
prop1 = fdt.Property('prop1')
assert prop1 != prop
prop1 = fdt.Property('prop')
assert prop1 == prop
str_data = prop.to_dts()
assert str_data == 'prop;\n'
blob_data, str_data, pos = prop.to_dtb('')
assert blob_data == struct.pack('>III', 0x03, 0, 0)
assert str_data == 'prop\0'
assert pos == 12
def test_strings_property():
prop = fdt.PropStrings('prop', 'test', 'test')
assert isinstance(prop, fdt.PropStrings)
assert prop.name == 'prop'
assert len(prop) == 2
assert prop.data == ['test', 'test']
with pytest.raises(AssertionError):
prop.append('test\0')
with pytest.raises(AssertionError):
prop.append(5)
prop1 = fdt.PropStrings('prop', 'test', 'test', 'test')
assert prop1 != prop
prop.append("test")
assert len(prop) == 3
assert prop1 == prop
str_data = prop.to_dts()
assert str_data == 'prop = "test", "test", "test";\n'
def test_words_property():
prop = fdt.PropWords('prop', 0x11111111, 0x55555555)
assert isinstance(prop, fdt.PropWords)
assert prop.name == 'prop'
assert len(prop) == 2
assert prop.data == [0x11111111, 0x55555555]
with pytest.raises(AssertionError):
prop.append('test')
with pytest.raises(AssertionError):
prop.append(0x5555555555)
prop1 = fdt.PropWords('prop', 0x11111111, 0x55555555, 0x00)
assert prop1 != prop
prop.append(0x00)
assert len(prop) == 3
assert prop1 == prop
str_data = prop.to_dts()
assert str_data == 'prop = <0x11111111 0x55555555 0x0>;\n'
def test_bytes_property():
prop = fdt.PropBytes('prop', 0x10, 0x50)
assert isinstance(prop, fdt.PropBytes)
assert prop.name == 'prop'
assert len(prop) == 2
assert prop.data == b"\x10\x50"
with pytest.raises(AssertionError):
prop.append('test')
with pytest.raises(AssertionError):
prop.append(256)
prop1 = fdt.PropBytes('prop', data=b"\x10\x50\x00")
assert prop1 != prop
prop.append(0x00)
assert len(prop) == 3
assert prop1 == prop
str_data = prop.to_dts()
assert str_data == 'prop = [10 50 00];\n'
def test_node():
# create node object
node = fdt.Node('/')
node.append(fdt.Property('prop'))
node.append(fdt.PropStrings('prop_str', 'test', 'test'))
node.append(fdt.PropWords('prop_word', 0x11111111, 0x55555555))
node.append(fdt.PropBytes('prop_byte', 0x10, 0x50))
subnode0 = fdt.Node('subnode0')
subnode0.append(fdt.Property('prop0'))
subnode0.append(fdt.PropStrings('prop_str0', 'test'))
subnode1 = fdt.Node('subnode1')
subnode1.append(fdt.Property('prop1'))
subnode1.append(fdt.PropWords('prop_word1', 0x11111111))
subnode0.append(subnode1)
node.append(subnode0)
assert isinstance(node, fdt.Node)
assert node.name == '/'
assert len(node.props) == 4
assert len(node.nodes) == 1
# Use only node constructor
new_node = fdt.Node('/',
fdt.Property('prop'),
fdt.PropStrings('prop_str', 'test', 'test'),
fdt.PropWords('prop_word', 0x11111111, 0x55555555),
fdt.PropBytes('prop_byte', 0x10, 0x50),
fdt.Node('subnode0',
fdt.Property('prop0'),
fdt.PropStrings('prop_str0', 'test'),
fdt.Node('subnode1',
fdt.Property('prop1'),
fdt.PropWords('prop_word1', 0x11111111)
)
)
)
assert node == new_node
with pytest.raises(AssertionError):
node.append('test')
with pytest.raises(Exception):
node.append(256)
with pytest.raises(Exception):
node.append(fdt.Property('prop'))
copy_node = node.copy()
assert copy_node == node
copy_node.set_property('prop_word', [0x10, 0x50])
assert copy_node != node
# export to dts
str_data = node.to_dts()
out = "/ {\n"
out += " prop;\n"
out += " prop_str = \"test\", \"test\";\n"
out += " prop_word = <0x11111111 0x55555555>;\n"
out += " prop_byte = [10 50];\n"
out += " subnode0 {\n"
out += " prop0;\n"
out += " prop_str0 = \"test\";\n"
out += " subnode1 {\n"
out += " prop1;\n"
out += " prop_word1 = <0x11111111>;\n"
out += " };\n"
out += " };\n"
out += "};\n"
assert str_data == out
def test_node_set_property():
root_node = fdt.Node('/')
# add properties into node by set_property method
root_node.set_property('prop', None)
root_node.set_property('int_prop', 1000)
root_node.set_property('list_int_prop', [1, 2])
root_node.set_property('str_prop', 'value')
root_node.set_property('list_str_prop', ['value1', 'value2'])
root_node.set_property('bytes_prop', b'\x00\x55\x66')
# validate types and values
assert len(root_node.props) == 6
assert isinstance(root_node.get_property('prop'), fdt.Property)
assert isinstance(root_node.get_property('int_prop'), fdt.PropWords)
assert root_node.get_property('int_prop').value == 1000
assert isinstance(root_node.get_property('list_int_prop'), fdt.PropWords)
assert root_node.get_property('list_int_prop').data == [1, 2]
assert isinstance(root_node.get_property('str_prop'), fdt.PropStrings)
assert root_node.get_property('str_prop').value == 'value'
assert isinstance(root_node.get_property('list_str_prop'), fdt.PropStrings)
assert root_node.get_property('list_str_prop').data == ['value1', 'value2']
assert isinstance(root_node.get_property('bytes_prop'), fdt.PropBytes)
assert root_node.get_property('bytes_prop').data == b'\x00\x55\x66'
# update property in node by set_property method
root_node.set_property('list_int_prop', [1, 2, 3])
# validate property value
assert root_node.get_property('list_int_prop').data == [1, 2, 3]