[gtk/headless-tests: 3/3] Cleanups
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/headless-tests: 3/3] Cleanups
- Date: Sun, 21 Mar 2021 02:20:29 +0000 (UTC)
commit 2284087f0c7e4189fe1b986352f949bf07dbf528
Author: Matthias Clasen <mclasen redhat com>
Date: Sat Mar 20 22:14:41 2021 -0400
Cleanups
Make the tests run quietly, and exit non-zero if they fail.
And use the in-tree library and typelib.
tests/headless-tests.py | 147 +++++++++++++++-----------------------------
tests/run-headless-tests.sh | 11 +++-
2 files changed, 59 insertions(+), 99 deletions(-)
---
diff --git a/tests/headless-tests.py b/tests/headless-tests.py
index 15e972c451..9b44b8c28e 100644
--- a/tests/headless-tests.py
+++ b/tests/headless-tests.py
@@ -1,8 +1,8 @@
+import sys
import subprocess
import gi
gi.require_version('Gdk', '4.0')
-gi.require_version('Gtk', '4.0')
from gi.repository import GLib, Gdk
from pydbus import SessionBus
@@ -14,9 +14,11 @@ done = False
monitor_model = None
def terminate():
- print("terminating")
- if session != None:
- session.Stop()
+ for key in monitors:
+ monitor = monitors[key];
+ pipeline = monitor['pipeline'];
+ pipeline.terminate()
+ sys.exit(1)
def stream_added_closure(name):
def stream_added(node_id):
@@ -26,17 +28,17 @@ def stream_added_closure(name):
width = monitor['width'];
height = monitor['height'];
+ # Use gstreamer out-of-process, since the gst gl support gets
+ # itself into a twist with its wayland connection when monitors
+ # disapper
pipeline_desc = f'gst-launch-1.0 pipewiresrc path={node_id} !
video/x-raw,max-framerate={freq}/1,width={width},height={height} ! videoconvert ! glimagesink'
- # print(f'launching {pipeline_desc}')
- monitor['pipeline'] = subprocess.Popen([pipeline_desc], shell=True, stdout=subprocess.DEVNULL)
+ monitor['pipeline'] = subprocess.Popen([pipeline_desc], shell=True, stdout=subprocess.DEVNULL,
stderr=subprocess.DEVNULL)
return stream_added
def add_monitor(name, width, height, freq):
- print(f'adding monitor "{name}": {width}x{height}, {freq}Hz')
session_path = screen_cast.CreateSession({})
- # print(f'Session {session_path}')
session = bus.get('org.gnome.Mutter.ScreenCast', session_path)
monitors[name] = {
"session": session,
@@ -45,79 +47,33 @@ def add_monitor(name, width, height, freq):
"freq": freq
}
stream_path = session.RecordVirtual({})
- # print(f'Stream path {stream_path}')
stream = bus.get('org.gnome.Mutter.ScreenCast', stream_path)
stream.onPipeWireStreamAdded = stream_added_closure(name)
session.Start()
def remove_monitor(name):
- print(f'removing monitor "{name}"')
- monitor = monitors[name];
- if monitor == None:
- print("monitor not found")
- else:
- try:
- pipeline = monitor['pipeline']
- pipeline.kill()
-
- session = monitor['session']
- session.Stop()
- except KeyError:
- print("no session")
- monitors[name] = None
+ try:
+ monitor = monitors[name];
+ pipeline = monitor['pipeline']
+ pipeline.kill()
+ session = monitor['session']
+ session.Stop()
+ except KeyError:
+ print("failed to remove monitor")
+ monitors[name] = None
+
+expected_change = None
+loop = None
def quit_cb(loop):
loop.quit()
def wait(millis):
+ global loop
loop = GLib.MainLoop()
GLib.timeout_add(millis, quit_cb, loop)
loop.run()
-def report_monitor(monitor):
- manufacturer = monitor.get_manufacturer()
- model = monitor.get_model()
- geometry = monitor.get_geometry()
- scale = monitor.get_scale_factor()
- freq = monitor.get_refresh_rate()
- width = monitor.get_width_mm()
- height = monitor.get_height_mm()
- connector = monitor.get_connector()
- print(f' manufacturer: {manufacturer}')
- print(f' model: {model}')
- print(f' geometry: {geometry.x} {geometry.y} {geometry.width} {geometry.height}')
- print(f' scale {scale}')
- print(f' frequency {freq}')
- print(f' size {width} x {height}')
- print(f' connector {connector}')
-
-def monitor_changed(monitor, pspec):
- print('monitor changed')
- if pspec.name == 'manufacturer':
- manufacturer = monitor.get_manufacturer()
- print(f' manufacturer: {manufacturer}')
- elif pspec.name == 'model':
- model = monitor.get_model()
- print(f' model: {model}')
- elif pspec.name == 'geometry':
- geometry = monitor.get_geometry()
- print(f' geometry: {geometry.x} {geometry.y} {geometry.width} {geometry.height}')
- elif pspec.name == 'scale-factor':
- scale = monitor.get_scale_factor()
- print(f' scale {scale}')
- elif pspec.name == 'refresh-rate':
- freq = monitor.get_refresh_rate()
- print(f' frequency {freq}')
- elif pspec.name == 'width-mm' or pspec.name == 'height-mm':
- width = monitor.get_width_mm()
- height = monitor.get_height_mm()
- print(f' size {width} x {height}')
- elif pspec.name == 'connector':
- connector = monitor.get_connector()
- print(f' connector {connector}')
-
-expected_change = None
-
def monitors_changed(monitors, position, removed, added):
global expected_change
@@ -127,13 +83,7 @@ def monitors_changed(monitors, position, removed, added):
assert added == expected_change['added'], "Unexpected added in monitors-changed"
expected_change = None
-
- # print(f'monitors changed: {position}, {removed}, {added}')
- for i in range(position, position + added):
- monitor = monitors.get_item(i)
- #print(f'new monitor {i}:')
- # report_monitor(monitor)
- # monitor.connect('notify', monitor_changed)
+ loop.quit()
def launch_observer():
global monitor_model
@@ -155,53 +105,56 @@ def expect_monitors_changed(position, removed, added, timeout):
wait(timeout)
assert expected_change == None, "Expected change did not happen"
+def got_connector(monitor, pspec):
+ loop.quit()
+
def expect_monitor(position, width, height, freq):
assert monitor_model.get_n_items() > position, f'Monitor {position} not present'
monitor = monitor_model.get_item(position)
+ if monitor.get_connector() == None:
+ handler = monitor.connect('notify::connector', got_connector)
+ wait(500)
+ monitor.disconnect(handler)
geometry = monitor.get_geometry()
assert geometry.width == width, "Unexpected monitor width"
assert geometry.height == height, "Unexpected monitor height"
assert monitor.get_refresh_rate() == freq, "Unexpected monitor frequency"
def run_commands():
+ try:
+ launch_observer()
+ wait(500)
- launch_observer()
- wait(500)
-
- add_monitor("0", 100, 100, 60)
- expect_monitors_changed(0, 0, 1, 500)
- expect_monitor (0, 100, 100, 60000) # GTK reports frequency in mHz
+ add_monitor("0", width=100, height=100, freq=60)
+ expect_monitors_changed(0, 0, 1, 500)
+ expect_monitor (position=0, width=100, height=100, freq=60000)
- add_monitor("1", 1024, 768, 144)
- expect_monitors_changed(1, 0, 1, 500)
- expect_monitor (1, 1024, 768, 144000)
+ add_monitor("1", width=1024, height=768, freq=144)
+ expect_monitors_changed(1, 0, 1, 500)
+ expect_monitor (position=1, width=1024, height=768, freq=144000)
- remove_monitor("0")
- expect_monitors_changed(0, 1, 0, 11000) # mutter takes 10 seconds to remove it
+ remove_monitor("0")
+ expect_monitors_changed(0, 1, 0, 11000) # mutter takes 10 seconds to remove it
- remove_monitor("1")
- expect_monitors_changed(0, 1, 0, 11000)
+ remove_monitor("1")
+ expect_monitors_changed(0, 1, 0, 11000)
+ except AssertionError as e:
+ print("Error: {0}".format(e))
+ terminate()
def mutter_appeared(name):
- global waiting
global screen_cast
global done
- if waiting:
- print("mutter entered the bus")
-
screen_cast = bus.get('org.gnome.Mutter.ScreenCast',
'/org/gnome/Mutter/ScreenCast')
run_commands()
done = True
def mutter_vanished():
- global waiting
- if screen_cast == None:
- waiting = True
- print("mutter is not on the bus. Waiting...")
- else:
+ global done
+ if screen_cast != None:
print("mutter left the bus")
- terminate()
+ done = True
bus = SessionBus()
bus.watch_name('org.gnome.Mutter.ScreenCast', 0, mutter_appeared, mutter_vanished)
diff --git a/tests/run-headless-tests.sh b/tests/run-headless-tests.sh
index 6cf625c713..1184f43aad 100755
--- a/tests/run-headless-tests.sh
+++ b/tests/run-headless-tests.sh
@@ -6,12 +6,19 @@ dbus-run-session sh <<EOF
# echo WAYLAND_DISPLAY=gtk-test
mutter --headless --wayland-display gtk-test >&mutter.log &
+pid=\$!
export WAYLAND_DISPLAY=gtk-test
export GDK_BACKEND=wayland
-# export WAYLAND_DEBUG=1
-# export LD_PRELOAD=`pwd`/build/gtk/libgtk-4.so
+
+export GI_TYPELIB_PATH=\$(pwd)/build/gtk:/usr/lib64/girepository-1.0
+export LD_PRELOAD=\$(pwd)/build/gtk/libgtk-4.so
python tests/headless-tests.py
+status=\$?
+
+kill \$pid
+
+exit \$status
EOF
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]