gnome-shell/js/perf/headlessStart.js
Jonas Ådahl 9dd3d887d2 Add 'headless start' perf test
This tests that GNOME Shell will launch sucessfully despite there being
no monitors on startup, and successfully hide and then show the
overview, once the monitor is connected.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2623>
2023-02-06 18:10:01 +00:00

112 lines
2.8 KiB
JavaScript

// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
/* exported init, run, finish, script_monitorsChanged, script_overviewHideDone,
script_overviewShowDone, METRICS,
*/
/* eslint camelcase: ["error", { properties: "never", allow: ["^script_"] }] */
const {GLib, MetaTest, Shell} = imports.gi;
const Main = imports.ui.main;
const Scripting = imports.ui.scripting;
// This script tests that the shell handles connecting monitors after startup
// is properly handled.
var METRICS = {};
let _testMonitor = null;
/**
* init:
*/
function init() {
global.connect('shutdown', () => {
_testMonitor?.destroy();
});
global.context.connect('started',
() => {
GLib.timeout_add_seconds(
GLib.PRIORITY_LOW, 2,
() => {
log('Connecting 1280x720 test monitor');
_testMonitor = MetaTest.TestMonitor.new(
global.context, 1280, 720, 60.0);
});
});
Scripting.defineScriptEvent('monitorsChanged', 'Monitors changed');
const display = global.display;
console.assert(display.get_n_monitors() === 0, 'Not running headless');
const monitorManager = global.backend.get_monitor_manager();
const monitorsChangedHandlerId = monitorManager.connect('monitors-changed',
() => {
console.assert(display.get_n_monitors() === 1,
'Expected a single monitor');
Scripting.scriptEvent('monitorsChanged');
monitorManager.disconnect(monitorsChangedHandlerId);
});
Shell.PerfLog.get_default().set_enabled(true);
}
/**
* run:
*/
async function run() {
/* eslint-disable no-await-in-loop */
Scripting.defineScriptEvent('overviewShowDone', 'Overview finished showing');
Scripting.defineScriptEvent('overviewHideDone', 'Overview finished hiding');
Main.overview.connect('shown',
() => Scripting.scriptEvent('overviewShowDone'));
Main.overview.connect('hidden',
() => Scripting.scriptEvent('overviewHideDone'));
Main.overview.hide();
await Scripting.waitLeisure();
Main.overview.show();
await Scripting.waitLeisure();
/* eslint-enable no-await-in-loop */
}
let monitorsChanged = false;
let overviewHidden = false;
let overviewShown = false;
/**
* script_monitorsChanged:
*/
function script_monitorsChanged() {
monitorsChanged = true;
}
/**
* script_overviewHideDone:
*/
function script_overviewHideDone() {
overviewHidden = true;
}
/**
* script_overviewShowDone:
*/
function script_overviewShowDone() {
overviewShown = true;
}
/**
* finish:
*/
function finish() {
if (!monitorsChanged)
throw new Error('Monitors never changed');
if (!overviewHidden)
throw new Error('Failed to hide overview');
if (!overviewShown)
throw new Error('Failed to show overview');
}