Merge branch 'backport-1448-dbus-tests-glib-2-64' into 'glib-2-64'

Backport !1448 memory monitor test dependency fixes to glib-2-64

See merge request GNOME/glib!1471
This commit is contained in:
Emmanuele Bassi 2020-05-14 14:06:55 +00:00
commit 46756977a1
3 changed files with 170 additions and 151 deletions

View File

@ -14,89 +14,98 @@ __license__ = 'LGPL 3+'
import unittest import unittest
import sys import sys
import subprocess import subprocess
import dbus
import dbus.mainloop.glib
import dbusmock
import fcntl import fcntl
import os import os
import time import time
from gi.repository import GLib import taptestrunner
from gi.repository import Gio
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) try:
# Do all non-standard imports here so we can skip the tests if any
# needed packages are not available.
import dbus
import dbus.mainloop.glib
import dbusmock
from gi.repository import GLib
from gi.repository import Gio
# XDG_DESKTOP_PORTAL_PATH = os.path.expanduser("~/.cache/jhbuild/build/xdg-desktop-portal/xdg-desktop-portal") dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
XDG_DESKTOP_PORTAL_PATH = "@libexecdir@/xdg-desktop-portal"
class TestLowMemoryMonitor(dbusmock.DBusTestCase): # XDG_DESKTOP_PORTAL_PATH = os.path.expanduser("~/.cache/jhbuild/build/xdg-desktop-portal/xdg-desktop-portal")
'''Test GMemoryMonitorDBus''' XDG_DESKTOP_PORTAL_PATH = "@libexecdir@/xdg-desktop-portal"
@classmethod class TestLowMemoryMonitor(dbusmock.DBusTestCase):
def setUpClass(klass): '''Test GMemoryMonitorDBus'''
klass.start_system_bus()
klass.dbus_con = klass.get_dbus(True)
def setUp(self): @classmethod
try: def setUpClass(klass):
Gio.MemoryMonitor klass.start_system_bus()
except AttributeError: klass.dbus_con = klass.get_dbus(True)
raise unittest.SkipTest('Low memory monitor not in '
'introspection data. Requires '
'GObject-Introspection ≥ 1.63.2')
try:
(self.p_mock, self.obj_lmm) = self.spawn_server_template(
'low_memory_monitor', {}, stdout=subprocess.PIPE)
except ModuleNotFoundError:
raise unittest.SkipTest("Low memory monitor dbusmock template not "
"found. Requires dbusmock ≥ 0.18.4.")
# set log to nonblocking
flags = fcntl.fcntl(self.p_mock.stdout, fcntl.F_GETFL)
fcntl.fcntl(self.p_mock.stdout, fcntl.F_SETFL, flags | os.O_NONBLOCK)
self.last_warning = -1
self.dbusmock = dbus.Interface(self.obj_lmm, dbusmock.MOCK_IFACE)
self.memory_monitor = Gio.MemoryMonitor.dup_default()
self.memory_monitor.connect("low-memory-warning", self.memory_warning_cb)
self.mainloop = GLib.MainLoop()
self.main_context = self.mainloop.get_context()
def tearDown(self): def setUp(self):
self.p_mock.terminate() try:
self.p_mock.wait() Gio.MemoryMonitor
except AttributeError:
raise unittest.SkipTest('Low memory monitor not in '
'introspection data. Requires '
'GObject-Introspection ≥ 1.63.2')
try:
(self.p_mock, self.obj_lmm) = self.spawn_server_template(
'low_memory_monitor', {}, stdout=subprocess.PIPE)
except ModuleNotFoundError:
raise unittest.SkipTest("Low memory monitor dbusmock template not "
"found. Requires dbusmock ≥ 0.18.4.")
# set log to nonblocking
flags = fcntl.fcntl(self.p_mock.stdout, fcntl.F_GETFL)
fcntl.fcntl(self.p_mock.stdout, fcntl.F_SETFL, flags | os.O_NONBLOCK)
self.last_warning = -1
self.dbusmock = dbus.Interface(self.obj_lmm, dbusmock.MOCK_IFACE)
self.memory_monitor = Gio.MemoryMonitor.dup_default()
self.memory_monitor.connect("low-memory-warning", self.memory_warning_cb)
self.mainloop = GLib.MainLoop()
self.main_context = self.mainloop.get_context()
def memory_warning_cb(self, monitor, level): def tearDown(self):
self.last_warning = level self.p_mock.terminate()
self.main_context.wakeup() self.p_mock.wait()
def test_low_memory_warning_signal(self): def memory_warning_cb(self, monitor, level):
'''LowMemoryWarning signal''' self.last_warning = level
self.main_context.wakeup()
# Wait 2 seconds def test_low_memory_warning_signal(self):
timeout = 2 '''LowMemoryWarning signal'''
while timeout > 0:
time.sleep(0.5)
timeout -= 0.5
self.main_context.iteration(False)
self.dbusmock.EmitWarning(100) # Wait 2 seconds
# Wait 2 seconds or until warning timeout = 2
timeout = 2 while timeout > 0:
while timeout > 0 and self.last_warning != 100: time.sleep(0.5)
time.sleep(0.5) timeout -= 0.5
timeout -= 0.5 self.main_context.iteration(False)
self.main_context.iteration(False)
self.assertEqual(self.last_warning, 100)
self.dbusmock.EmitWarning(255) self.dbusmock.EmitWarning(100)
# Wait 2 seconds or until warning # Wait 2 seconds or until warning
timeout = 2 timeout = 2
while timeout > 0 and self.last_warning != 255: while timeout > 0 and self.last_warning != 100:
time.sleep(0.5) time.sleep(0.5)
timeout -= 0.5 timeout -= 0.5
self.main_context.iteration(False) self.main_context.iteration(False)
self.assertEqual(self.last_warning, 255) self.assertEqual(self.last_warning, 100)
self.dbusmock.EmitWarning(255)
# Wait 2 seconds or until warning
timeout = 2
while timeout > 0 and self.last_warning != 255:
time.sleep(0.5)
timeout -= 0.5
self.main_context.iteration(False)
self.assertEqual(self.last_warning, 255)
except ImportError as e:
@unittest.skip("Cannot import %s" % e.name)
class TestLowMemoryMonitor(unittest.TestCase):
def test_low_memory_warning_signal(self):
pass
if __name__ == '__main__': if __name__ == '__main__':
# avoid writing to stderr unittest.main(testRunner=taptestrunner.TAPTestRunner())
unittest.main(testRunner=unittest.TextTestRunner(stream=sys.stdout, verbosity=2))

View File

@ -14,105 +14,114 @@ __license__ = 'LGPL 3+'
import unittest import unittest
import sys import sys
import subprocess import subprocess
import dbus
import dbus.mainloop.glib
import dbusmock
import fcntl import fcntl
import os import os
import time import time
from gi.repository import GLib import taptestrunner
from gi.repository import Gio
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) try:
# Do all non-standard imports here so we can skip the tests if any
# needed packages are not available.
import dbus
import dbus.mainloop.glib
import dbusmock
from gi.repository import GLib
from gi.repository import Gio
# XDG_DESKTOP_PORTAL_PATH = os.path.expanduser("~/.cache/jhbuild/build/xdg-desktop-portal/xdg-desktop-portal") dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
XDG_DESKTOP_PORTAL_PATH = "@libexecdir@/xdg-desktop-portal"
class TestLowMemoryMonitorPortal(dbusmock.DBusTestCase): # XDG_DESKTOP_PORTAL_PATH = os.path.expanduser("~/.cache/jhbuild/build/xdg-desktop-portal/xdg-desktop-portal")
'''Test GMemoryMonitorPortal''' XDG_DESKTOP_PORTAL_PATH = "@libexecdir@/xdg-desktop-portal"
@classmethod class TestLowMemoryMonitorPortal(dbusmock.DBusTestCase):
def setUpClass(klass): '''Test GMemoryMonitorPortal'''
klass.start_system_bus()
klass.dbus_con = klass.get_dbus(True)
# Start session bus so that xdg-desktop-portal can run on it
klass.start_session_bus()
def setUp(self): @classmethod
try: def setUpClass(klass):
Gio.MemoryMonitor klass.start_system_bus()
except AttributeError: klass.dbus_con = klass.get_dbus(True)
raise unittest.SkipTest('Low memory monitor not in ' # Start session bus so that xdg-desktop-portal can run on it
'introspection data. Requires ' klass.start_session_bus()
'GObject-Introspection ≥ 1.63.2')
try:
(self.p_mock, self.obj_lmm) = self.spawn_server_template(
'low_memory_monitor', {}, stdout=subprocess.PIPE)
except ModuleNotFoundError:
raise unittest.SkipTest("Low memory monitor dbusmock template not "
"found. Requires dbusmock ≥ 0.18.4.")
# set log to nonblocking
flags = fcntl.fcntl(self.p_mock.stdout, fcntl.F_GETFL)
fcntl.fcntl(self.p_mock.stdout, fcntl.F_SETFL, flags | os.O_NONBLOCK)
self.last_warning = -1
self.dbusmock = dbus.Interface(self.obj_lmm, dbusmock.MOCK_IFACE)
try:
self.xdp = subprocess.Popen([XDG_DESKTOP_PORTAL_PATH])
except FileNotFoundError:
raise unittest.SkipTest("xdg-desktop-portal not available")
try: def setUp(self):
self.wait_for_bus_object('org.freedesktop.portal.Desktop', try:
'/org/freedesktop/portal/desktop') Gio.MemoryMonitor
except: except AttributeError:
raise raise unittest.SkipTest('Low memory monitor not in '
# subprocess.Popen(['gdbus', 'monitor', '--session', '--dest', 'org.freedesktop.portal.Desktop']) 'introspection data. Requires '
'GObject-Introspection ≥ 1.63.2')
try:
(self.p_mock, self.obj_lmm) = self.spawn_server_template(
'low_memory_monitor', {}, stdout=subprocess.PIPE)
except ModuleNotFoundError:
raise unittest.SkipTest("Low memory monitor dbusmock template not "
"found. Requires dbusmock ≥ 0.18.4.")
# set log to nonblocking
flags = fcntl.fcntl(self.p_mock.stdout, fcntl.F_GETFL)
fcntl.fcntl(self.p_mock.stdout, fcntl.F_SETFL, flags | os.O_NONBLOCK)
self.last_warning = -1
self.dbusmock = dbus.Interface(self.obj_lmm, dbusmock.MOCK_IFACE)
try:
self.xdp = subprocess.Popen([XDG_DESKTOP_PORTAL_PATH])
except FileNotFoundError:
raise unittest.SkipTest("xdg-desktop-portal not available")
os.environ['GTK_USE_PORTAL'] = "1" try:
self.memory_monitor = Gio.MemoryMonitor.dup_default() self.wait_for_bus_object('org.freedesktop.portal.Desktop',
assert("GMemoryMonitorPortal" in str(self.memory_monitor)) '/org/freedesktop/portal/desktop')
self.memory_monitor.connect("low-memory-warning", self.portal_memory_warning_cb) except:
self.mainloop = GLib.MainLoop() raise
self.main_context = self.mainloop.get_context() # subprocess.Popen(['gdbus', 'monitor', '--session', '--dest', 'org.freedesktop.portal.Desktop'])
def tearDown(self): os.environ['GTK_USE_PORTAL'] = "1"
self.p_mock.terminate() self.memory_monitor = Gio.MemoryMonitor.dup_default()
self.p_mock.wait() assert("GMemoryMonitorPortal" in str(self.memory_monitor))
self.memory_monitor.connect("low-memory-warning", self.portal_memory_warning_cb)
self.mainloop = GLib.MainLoop()
self.main_context = self.mainloop.get_context()
def portal_memory_warning_cb(self, monitor, level): def tearDown(self):
self.last_warning = level self.p_mock.terminate()
self.main_context.wakeup() self.p_mock.wait()
def test_low_memory_warning_portal_signal(self): def portal_memory_warning_cb(self, monitor, level):
'''LowMemoryWarning signal''' self.last_warning = level
self.main_context.wakeup()
# Wait 2 seconds def test_low_memory_warning_portal_signal(self):
timeout = 2 '''LowMemoryWarning signal'''
while timeout > 0:
time.sleep(0.5)
timeout -= 0.5
self.main_context.iteration(False)
self.dbusmock.EmitWarning(100) # Wait 2 seconds
# Wait 2 seconds or until warning timeout = 2
timeout = 2 while timeout > 0:
while timeout > 0 and self.last_warning != 100: time.sleep(0.5)
time.sleep(0.5) timeout -= 0.5
timeout -= 0.5 self.main_context.iteration(False)
self.main_context.iteration(False)
self.assertEqual(self.last_warning, 100)
self.dbusmock.EmitWarning(255) self.dbusmock.EmitWarning(100)
# Wait 2 seconds or until warning # Wait 2 seconds or until warning
timeout = 2 timeout = 2
while timeout > 0 and self.last_warning != 255: while timeout > 0 and self.last_warning != 100:
time.sleep(0.5) time.sleep(0.5)
timeout -= 0.5 timeout -= 0.5
self.main_context.iteration(False) self.main_context.iteration(False)
self.assertEqual(self.last_warning, 255) self.assertEqual(self.last_warning, 100)
self.dbusmock.EmitWarning(255)
# Wait 2 seconds or until warning
timeout = 2
while timeout > 0 and self.last_warning != 255:
time.sleep(0.5)
timeout -= 0.5
self.main_context.iteration(False)
self.assertEqual(self.last_warning, 255)
except ImportError as e:
@unittest.skip("Cannot import %s" % e.name)
class TestLowMemoryMonitorPortal(unittest.TestCase):
def test_low_memory_warning_portal_signal(self):
pass
if __name__ == '__main__': if __name__ == '__main__':
# avoid writing to stderr unittest.main(testRunner=taptestrunner.TAPTestRunner())
unittest.main(testRunner=unittest.TextTestRunner(stream=sys.stdout, verbosity=2))

View File

@ -531,8 +531,9 @@ if installed_tests_enabled
cdata = configuration_data() cdata = configuration_data()
cdata.set('installed_tests_dir', installed_tests_execdir) cdata.set('installed_tests_dir', installed_tests_execdir)
cdata.set('program', memory_monitor_test + '.py') cdata.set('program', memory_monitor_test + '.py')
cdata.set('env', '')
configure_file( configure_file(
input: installed_tests_template, input: installed_tests_template_tap,
output: memory_monitor_test + '.test', output: memory_monitor_test + '.test',
install_dir: installed_tests_metadir, install_dir: installed_tests_metadir,
configuration: cdata configuration: cdata