[gtk/headless-tests: 3/3] Cleanups




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]