dbus-fast/tests/test_introspection.py
2025-03-06 12:27:01 -10:00

148 lines
4.3 KiB
Python

import os
from dbus_fast import (
ArgDirection,
InvalidMemberNameError,
PropertyAccess,
SignatureType,
)
from dbus_fast import introspection as intr
with open(f"{os.path.dirname(__file__)}/data/strict-introspection.xml") as f:
strict_data = f.read()
with open(f"{os.path.dirname(__file__)}/data/sloppy-introspection.xml") as f:
sloppy_data = f.read()
def test_introspection_from_xml_sloppy():
intr.Node.parse(sloppy_data, validate_property_names=False)
def test_introspection_from_xml_strict():
try:
node = intr.Node.parse(sloppy_data)
except InvalidMemberNameError:
pass
else:
assert False, "Expected an AssertionError"
node = intr.Node.parse(strict_data)
assert len(node.interfaces) == 1
interface = node.interfaces[0]
assert len(node.nodes) == 2
assert len(interface.methods) == 3
assert len(interface.signals) == 2
assert len(interface.properties) == 1
assert type(node.nodes[0]) is intr.Node
assert node.nodes[0].name == "child_of_sample_object"
assert type(node.nodes[1]) is intr.Node
assert node.nodes[1].name == "another_child_of_sample_object"
assert interface.name == "com.example.SampleInterface0"
frobate = interface.methods[0]
assert type(frobate) is intr.Method
assert frobate.name == "Frobate"
assert len(frobate.in_args) == 1
assert len(frobate.out_args) == 2
foo = frobate.in_args[0]
assert type(foo) is intr.Arg
assert foo.name == "foo"
assert foo.direction == ArgDirection.IN
assert foo.signature == "i"
assert type(foo.type) is SignatureType
assert foo.type.token == "i"
bar = frobate.out_args[0]
assert type(bar) is intr.Arg
assert bar.name == "bar"
assert bar.direction == ArgDirection.OUT
assert bar.signature == "s"
assert type(bar.type) is SignatureType
assert bar.type.token == "s"
prop = interface.properties[0]
assert type(prop) is intr.Property
assert prop.name == "Bar"
assert prop.signature == "y"
assert type(prop.type) is SignatureType
assert prop.type.token == "y"
assert prop.access == PropertyAccess.WRITE
changed = interface.signals[0]
assert type(changed) is intr.Signal
assert changed.name == "Changed"
assert len(changed.args) == 1
new_value = changed.args[0]
assert type(new_value) is intr.Arg
assert new_value.name == "0-new_value"
assert new_value.signature == "b"
def test_example_introspection_to_xml():
node = intr.Node.parse(strict_data)
tree = node.to_xml()
assert tree.tag == "node"
assert tree.attrib.get("name") == "/com/example/sample_object0"
assert len(tree) == 3
interface = tree[0]
assert interface.tag == "interface"
assert interface.get("name") == "com.example.SampleInterface0"
assert len(interface) == 6
method = interface[0]
assert method.tag == "method"
assert method.get("name") == "Frobate"
assert len(method) == 4
arg = method[0]
assert arg.tag == "arg"
assert arg.attrib.get("name") == "foo"
assert arg.attrib.get("type") == "i"
assert arg.attrib.get("direction") == "in"
annotation = method[3]
assert annotation.tag == "annotation"
assert annotation.attrib.get("name") == "org.freedesktop.DBus.Deprecated"
assert annotation.attrib.get("value") == "true"
signal = interface[3]
assert signal.tag == "signal"
assert signal.attrib.get("name") == "Changed"
assert len(signal) == 1
arg = signal[0]
assert arg.tag == "arg"
assert arg.attrib.get("name") == "0-new_value"
assert arg.attrib.get("type") == "b"
signal = interface[4]
assert signal.tag == "signal"
assert signal.attrib.get("name") == "ChangedMulti"
assert len(signal) == 2
arg = signal[0]
assert arg.tag == "arg"
assert arg.attrib.get("name") == "new_value1"
assert arg.attrib.get("type") == "b"
arg = signal[1]
assert arg.tag == "arg"
assert arg.attrib.get("name") == "0-new_value2"
assert arg.attrib.get("type") == "y"
prop = interface[5]
assert prop.attrib.get("name") == "Bar"
assert prop.attrib.get("type") == "y"
assert prop.attrib.get("access") == "write"
def test_default_interfaces():
# just make sure it doesn't throw
default = intr.Node.default()
assert type(default) is intr.Node