82 lines
2.7 KiB
Python
82 lines
2.7 KiB
Python
from tempfile import TemporaryFile
|
|
import threading
|
|
|
|
import pytest
|
|
|
|
from jeepney import (
|
|
DBusAddress, HeaderFields, message_bus, MessageType, new_error,
|
|
new_method_return,
|
|
)
|
|
from jeepney.io.threading import open_dbus_connection, DBusRouter, Proxy
|
|
|
|
@pytest.fixture()
|
|
def respond_with_fd():
|
|
name = "io.gitlab.takluyver.jeepney.tests.respond_with_fd"
|
|
addr = DBusAddress(bus_name=name, object_path='/')
|
|
|
|
with open_dbus_connection(bus='SESSION', enable_fds=True) as conn:
|
|
with DBusRouter(conn) as router:
|
|
status, = Proxy(message_bus, router).RequestName(name)
|
|
assert status == 1 # DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER
|
|
|
|
def _reply_once():
|
|
while True:
|
|
msg = conn.receive()
|
|
if msg.header.message_type is MessageType.method_call:
|
|
if msg.header.fields[HeaderFields.member] == 'GetFD':
|
|
with TemporaryFile('w+') as tf:
|
|
tf.write('readme')
|
|
tf.seek(0)
|
|
rep = new_method_return(msg, 'h', (tf,))
|
|
conn.send(rep)
|
|
return
|
|
else:
|
|
conn.send(new_error(msg, 'NoMethod'))
|
|
|
|
reply_thread = threading.Thread(target=_reply_once, daemon=True)
|
|
reply_thread.start()
|
|
yield addr
|
|
|
|
reply_thread.join()
|
|
|
|
|
|
@pytest.fixture()
|
|
def read_from_fd():
|
|
name = "io.gitlab.takluyver.jeepney.tests.read_from_fd"
|
|
addr = DBusAddress(bus_name=name, object_path='/')
|
|
|
|
with open_dbus_connection(bus='SESSION', enable_fds=True) as conn:
|
|
with DBusRouter(conn) as router:
|
|
status, = Proxy(message_bus, router).RequestName(name)
|
|
assert status == 1 # DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER
|
|
|
|
def _reply_once():
|
|
while True:
|
|
msg = conn.receive()
|
|
if msg.header.message_type is MessageType.method_call:
|
|
if msg.header.fields[HeaderFields.member] == 'ReadFD':
|
|
with msg.body[0].to_file('rb') as f:
|
|
f.seek(0)
|
|
b = f.read()
|
|
conn.send(new_method_return(msg, 'ay', (b,)))
|
|
return
|
|
else:
|
|
conn.send(new_error(msg, 'NoMethod'))
|
|
|
|
reply_thread = threading.Thread(target=_reply_once, daemon=True)
|
|
reply_thread.start()
|
|
yield addr
|
|
|
|
reply_thread.join()
|
|
|
|
|
|
@pytest.fixture()
|
|
def temp_file_and_contents():
|
|
data = b'abc123'
|
|
with TemporaryFile('w+b') as tf:
|
|
tf.write(data)
|
|
tf.flush()
|
|
tf.seek(0)
|
|
yield tf, data
|
|
|