mirror of
https://github.com/brl/mutter.git
synced 2024-11-24 00:50:42 -05:00
3eeecd42b0
We created pipes for the stdout of the spawned mock services. This resulted in the pipe being filled if enough things were logged, as nothing was reading from it. Change this to allow for two modes: verbose - where output is logged to the parent stderr, as well as non-verbose (default) - where things are logged directly to /dev/null. This fixes frozen tests when running with --repeat and a high enough repeat count. Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2139>
126 lines
3.9 KiB
Python
Executable File
126 lines
3.9 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
|
|
import dbus
|
|
import sys
|
|
import os
|
|
import fcntl
|
|
import subprocess
|
|
from collections import OrderedDict
|
|
from dbusmock import DBusTestCase
|
|
from dbus.mainloop.glib import DBusGMainLoop
|
|
|
|
DBusGMainLoop(set_as_default=True)
|
|
|
|
|
|
def get_templates_dir():
|
|
return os.path.join(os.path.dirname(__file__), 'dbusmock-templates')
|
|
|
|
def get_template_path(template_name):
|
|
return os.path.join(get_templates_dir(), template_name + '.py')
|
|
|
|
def get_subprocess_stdout():
|
|
if os.getenv('META_DBUS_RUNNER_VERBOSE') == '1':
|
|
return sys.stderr
|
|
else:
|
|
return subprocess.DEVNULL;
|
|
|
|
|
|
class MutterDBusTestCase(DBusTestCase):
|
|
@classmethod
|
|
def setUpClass(klass):
|
|
klass.mocks = OrderedDict()
|
|
|
|
DBusTestCase.setUpClass()
|
|
klass.start_session_bus()
|
|
klass.start_system_bus()
|
|
|
|
(klass.mocks_manager, klass.mock_obj) = klass.start_from_local_template(
|
|
'meta-mocks-manager', {'templates-dir': get_templates_dir()})
|
|
|
|
klass.start_from_template('logind')
|
|
klass.start_from_local_template('localed')
|
|
|
|
klass.system_bus_con = klass.get_dbus(system_bus=True)
|
|
klass.session_bus_con = klass.get_dbus(system_bus=False)
|
|
|
|
if klass.session_bus_con.name_has_owner('org.gnome.Mutter.DisplayConfig'):
|
|
raise Exception(
|
|
'org.gnome.Mutter.DisplayConfig already has owner on the session bus, bailing')
|
|
|
|
@classmethod
|
|
def tearDownClass(klass):
|
|
klass.mock_obj.Cleanup()
|
|
|
|
for (mock_server, mock_obj) in reversed(klass.mocks.values()):
|
|
mock_server.terminate()
|
|
mock_server.wait()
|
|
|
|
DBusTestCase.tearDownClass()
|
|
|
|
@classmethod
|
|
def start_from_template(klass, template, params={}):
|
|
mock_server, mock_obj = \
|
|
klass.spawn_server_template(template,
|
|
params,
|
|
get_subprocess_stdout())
|
|
|
|
mocks = (mock_server, mock_obj)
|
|
assert klass.mocks.setdefault(template, mocks) == mocks
|
|
return mocks
|
|
|
|
@classmethod
|
|
def start_from_local_template(klass, template_file_name, params={}):
|
|
template = get_template_path(template_file_name)
|
|
return klass.start_from_template(template, params)
|
|
|
|
@classmethod
|
|
def start_from_template_managed(klass, template):
|
|
klass.mock_obj.StartFromTemplate(template)
|
|
|
|
@classmethod
|
|
def start_from_local_template_managed(klass, template_file_name):
|
|
template = get_template_path(template_file_name)
|
|
klass.mock_obj.StartFromLocalTemplate(template)
|
|
|
|
@classmethod
|
|
def start_from_class(klass, mock_class, params={}):
|
|
mock_server = \
|
|
klass.spawn_server(mock_class.BUS_NAME,
|
|
mock_class.MAIN_OBJ,
|
|
mock_class.MAIN_IFACE,
|
|
mock_class.SYSTEM_BUS,
|
|
stdout=get_subprocess_stdout())
|
|
|
|
bus = klass.get_dbus(system_bus=mock_class.SYSTEM_BUS)
|
|
mock_obj = bus.get_object(mock_class.BUS_NAME, mock_class.MAIN_OBJ)
|
|
mock_class.load(mock_obj, params)
|
|
|
|
mocks = (mock_server, mock_obj)
|
|
assert klass.mocks.setdefault(mock_class, mocks) == mocks
|
|
return mocks
|
|
|
|
def wrap_call(self, args):
|
|
env = {}
|
|
env.update(os.environ)
|
|
env['NO_AT_BRIDGE'] = '1'
|
|
env['GSETTINGS_BACKEND'] = 'memory'
|
|
|
|
wrapper = env.get('META_DBUS_RUNNER_WRAPPER')
|
|
if wrapper == 'gdb':
|
|
args = ['gdb', '-ex', 'r', '-ex', 'bt full', '--args'] + args
|
|
elif wrapper:
|
|
args = wrapper.split(' ') + args
|
|
|
|
p = subprocess.Popen(args, env=env)
|
|
self.assertEqual(p.wait(), 0)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
MutterDBusTestCase.setUpClass()
|
|
test_case = MutterDBusTestCase()
|
|
test_case.assertGreater(len(sys.argv), 1)
|
|
try:
|
|
test_case.wrap_call(sys.argv[1:])
|
|
finally:
|
|
MutterDBusTestCase.tearDownClass()
|