summaryrefslogtreecommitdiff
path: root/tests/gsdtestcase.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/gsdtestcase.py')
-rw-r--r--tests/gsdtestcase.py81
1 files changed, 78 insertions, 3 deletions
diff --git a/tests/gsdtestcase.py b/tests/gsdtestcase.py
index 3a6ff9ca..88e71493 100644
--- a/tests/gsdtestcase.py
+++ b/tests/gsdtestcase.py
@@ -100,7 +100,7 @@ class GSDTestCase(X11SessionTestCase):
klass.p_notify_log.writer_attached()
klass.addClassCleanup(klass.stop_process, klass.p_notify)
- klass.start_session()
+ klass.configure_session()
klass.start_monitor()
klass.addClassCleanup(klass.stop_monitor)
@@ -111,6 +111,11 @@ class GSDTestCase(X11SessionTestCase):
raise KeyboardInterrupt()
signal.signal(signal.SIGTERM, r)
+ def tearDown(self):
+ # we check this at the end so that the other cleanup always happens
+ daemon_running = self.daemon.poll() == None
+ self.assertTrue(daemon_running or self.daemon_death_expected, 'daemon died during the test')
+
def run(self, result=None):
'''Show log files on failed tests
@@ -131,8 +136,8 @@ class GSDTestCase(X11SessionTestCase):
% (log_file, f.read()))
@classmethod
- def start_session(klass):
- '''Start minimal GNOME session'''
+ def configure_session(klass):
+ '''Configure minimal GNOME session'''
# create dummy session type and component
d = os.path.join(klass.workdir, 'config', 'gnome-session', 'sessions')
@@ -145,6 +150,34 @@ class GSDTestCase(X11SessionTestCase):
os.makedirs(d)
shutil.copy(os.path.join(os.path.dirname(__file__), 'dummyapp.desktop'), d)
+ def start_session(self):
+ self.session_log = OutputChecker()
+ self.session = subprocess.Popen(['gnome-session', '-f',
+ '-a', os.path.join(self.workdir, 'autostart'),
+ '--session=dummy', '--debug'],
+ stdout=self.session_log.fd,
+ stderr=subprocess.STDOUT)
+ self.session_log.writer_attached()
+
+ # wait until the daemon is on the bus
+ self.wait_for_bus_object('org.gnome.SessionManager',
+ '/org/gnome/SessionManager',
+ timeout=100)
+
+ self.session_log.check_line(b'fill: *** Done adding required components')
+
+ def stop_session(self):
+ '''Stop GNOME session'''
+
+ assert self.session
+ self.stop_process(self.session)
+ # dummyapp.desktop survives the session. This keeps the FD open in the
+ # CI environment when gnome-session fails to redirect the child output
+ # to journald.
+ # Though, gnome-session should probably kill the child anyway.
+ #self.session_log.assert_closed()
+ self.session_log.force_close()
+
@classmethod
def start_monitor(klass):
'''Start dbus-monitor'''
@@ -190,6 +223,7 @@ class GSDTestCase(X11SessionTestCase):
self.stop_process(self.logind)
self.logind_log.assert_closed()
+ @classmethod
def start_mutter(klass):
''' start mutter '''
@@ -200,12 +234,53 @@ class GSDTestCase(X11SessionTestCase):
'/org/gnome/Mutter/IdleMonitor/Core',
timeout=100)
+ @classmethod
def stop_mutter(klass):
'''stop mutter'''
assert klass.monitor
klass.stop_process(klass.mutter, timeout=2)
+ def start_plugin(self, env):
+ self.plugin_death_expected = False
+
+ # We need to redirect stdout to grab the debug messages.
+ # stderr is not needed by the testing infrastructure but is useful to
+ # see warnings and errors.
+ self.plugin_log = OutputChecker()
+ self.daemon = subprocess.Popen(
+ [os.path.join(top_builddir, 'plugins', self.gsd_plugin, 'gsd-' + self.gsd_plugin), '--verbose'],
+ stdout=self.plugin_log.fd,
+ stderr=subprocess.STDOUT,
+ env=env)
+ self.plugin_log.writer_attached()
+
+
+ bus = self.get_dbus(False)
+
+ timeout = 100
+ while timeout > 0:
+ if bus.name_has_owner('org.gnome.SettingsDaemon.' + self.gsd_plugin_case):
+ break
+
+ timeout -= 1
+ time.sleep(0.1)
+ if timeout <= 0:
+ assert timeout > 0, 'timed out waiting for plugin startup: %s' % (self.gsd_plugin_case)
+
+ def stop_plugin(self):
+ daemon_running = self.daemon.poll() == None
+ if daemon_running:
+ self.stop_process(self.daemon)
+ self.plugin_log.assert_closed()
+
+ def reset_settings(self, schema):
+ # reset all changed gsettings, so that tests are independent from each
+ # other
+ for k in schema.list_keys():
+ schema.reset(k)
+ Gio.Settings.sync()
+
@classmethod
def stop_process(cls, proc, timeout=1):
proc.terminate()